↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5
历史版本PostgreSQL 8.0 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

附录 B. 日期/时间支持

PostgreSQL 对所有日期/时间输入都使用一个内部的启发式解析器。日期和时间以字符串形式输入,并被拆分为不同的字段,同时初步判断每个字段中可能包含哪类信息。每个字段都会被解释,并被赋予数值、忽略或拒绝。解析器内部为所有文本字段都维护了查找表,包括月份、星期几以及时区。

本附录包含关于这些查找表内容的信息,并描述了解析器解码日期和时间时所使用的步骤。

B.1. 日期/时间输入解释

日期/时间输入字符串按照下面的过程进行解码。

  1. 将输入字符串拆分为词元,并把每个词元归类为字符串、时间、时区或数字。

    1. 如果数字词元包含冒号(:),则它是一个时间字符串。把其后的所有数字和冒号都包含进来。

    2. 如果数字词元包含连字符(-)、斜杠(/)或两个以上的点(.),则它是一个日期字符串,并且可能带有文本形式的月份。

    3. 如果词元仅由数字组成,那么它要么是单个字段,要么是 ISO 8601 的拼接式日期(例如,19990113 表示 1999 年 1 月 13 日)或时间(例如,141516 表示 14:15:16)。

    4. 如果词元以加号(+)或减号(-)开头,那么它要么是时区,要么是特殊字段。

  2. 如果词元是一个纯字母字符串,则将其与可能的字符串匹配。

    1. 对该词元做二分查找表查询,将它识别为特殊字符串(例如 today)、星期名(例如 Thursday)、 月份名(例如 January)或噪声词(例如 at、on)。

      设置字段值和字段位掩码。例如,为today设置年、月、日,为now还额外设置时、分、秒。

    2. 如果没有找到,再做一次类似的二分查找表查询,将该词元与时区匹配。

    3. 如果仍然没有找到,则抛出错误。

  3. 当词元是一个数字或数字字段时:

    1. 如果有八位或六位数字,并且之前还没有读取到其他日期字段,则将其解释为“拼接式日期”(例如 19990118 或 990118)。其解释方式分别为 YYYYMMDD 或 YYMMDD。

    2. 如果词元是三位数字,并且已经读取到了年份,则将其解释为一年中的第几天。

    3. 如果是四位或六位数字,并且已经读取到了年份,则将其解释为时间(HHMM 或 HHMMSS)。

    4. 如果有三位或更多位数字,并且尚未找到任何日期字段,则将其解释为年份(这会强制其余日期字段按 yy-mm-dd 的顺序解释)。

    5. 否则,假定日期字段顺序遵循 DateStyle 设置:mm-dd-yy、dd-mm-yy 或 yy-mm-dd。如果发现月份字段或日字段超出范围,则抛出错误。

  4. 如果指定了 BC,则将年份取反并加一后再用于内部存储。(格里高利历中没有 0 年,因此从数值上说,公元前 1 年会变成年 0。)

  5. 如果没有指定 BC,并且年份字段的长度为两位,则将年份调整为四位。如果该字段小于 70,则加上 2000,否则加上 1900。

    提示

    格里高利历公元 1-99 年可以使用带前导零的四位数字输入(例如,0099 表示公元 99 年)。以前版本的PostgreSQL接受三位数和一位数的年份,但从版本 7.0 开始,规则被收紧以减少歧义的可能性。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。