↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4
历史版本。 PostgreSQL 10 已结束支持。 2022-11-10. 请参阅 当前版本手册.

B.2. 处理无效或有歧义的时间戳 #

通常,如果一个日期/时间字符串在语法上有效,但包含超出范围的字段值,就会抛出错误。例如,指定 2 月 31 日的输入会被拒绝。

在夏令时转换期间,看似有效的时间戳字符串有可能表示一个不存在的时间戳,或者表示一个有歧义的时间戳。这类情况不会被拒绝;系统通过确定应采用哪个 UTC 偏移来消除歧义。例如,假设 TimeZone 参数被设置为 America/New_York,请看:

=> SELECT '2018-03-11 02:30'::timestamptz;
      timestamptz
------------------------
 2018-03-11 03:30:00-04
(1 row)

因为那一天在该时区是春季拨快的转换日,所以并不存在民用时间 2:30AM;时钟从 2AM EST 直接跳到 3AM EDT。PostgreSQL 将给定时间按标准时间(UTC-5)来解释,因此显示为 3:30AM EDT(UTC-4)。

相反,考虑秋季回拨转换期间的行为:

=> SELECT '2018-11-04 01:30'::timestamptz;
      timestamptz
------------------------
 2018-11-04 01:30:00-05
(1 row)

在那一天,1:30AM 有两种可能的解释:先有一次 1:30AM EDT;一小时后又有一次 1:30AM EST,其间时钟已从 2AM EDT 回拨到 1AM EST。再次,PostgreSQL 将给定时间按标准时间(UTC-5)来解释。我们可以通过显式指定夏令时来强制采用另一种解释:

=> SELECT '2018-11-04 01:30 EDT'::timestamptz;
      timestamptz
------------------------
 2018-11-04 01:30:00-04
(1 row)

在这类情况下适用的精确规则是:如果一个无效时间戳看起来落在夏令时前向跳转转换之内,则为它分配该时区在转换前一刻采用的 UTC 偏移;如果一个有歧义的时间戳可能落在回拨转换前后任一侧,则为它分配该时区在转换后一刻采用的 UTC 偏移。在大多数时区,这等价于说“有疑义时,优先按标准时间解释”。

在任何情况下,都可以显式指定与时间戳相关联的 UTC 偏移,方法是使用数字形式的 UTC 偏移,或者使用对应于固定 UTC 偏移的时区缩写。上述规则只在需要为 UTC 偏移会变化的时区推断 UTC 偏移时才适用。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.