Table of Contents
PostgreSQL 对所有日期/时间输入都使用一个内部的启发式解析器。日期和时间以字符串形式输入,并被拆分为不同的字段,同时初步判断每个字段中可能包含哪类信息。每个字段都会被解释,并被赋予数值、忽略或拒绝。解析器内部为所有文本字段都维护了查找表,包括月份、星期几以及时区。
本附录包含关于这些查找表内容的信息,并描述了解析器解码日期和时间时所使用的步骤。
日期/时间输入字符串按照下面的过程进行解码。
将输入字符串拆分为词元,并把每个词元归类为字符串、时间、时区或数字。
如果数字词元包含冒号(:),则它是一个时间字符串。把其后的所有数字和冒号都包含进来。
如果数字词元包含连字符(-)、斜杠(/)或两个以上的点(.),则它是一个日期字符串,并且可能带有文本形式的月份。如果已经见过日期词元,则它会被解释为时区名称(例如 America/New_York)。
如果词元仅由数字组成,那么它要么是单个字段,要么是 ISO 8601 的拼接式日期(例如,19990113 表示 1999 年 1 月 13 日)或时间(例如,141516 表示 14:15:16)。
如果词元以加号(+)或减号(-)开头,那么它要么是数字时区,要么是特殊字段。
如果词元是一个纯字母字符串,则将其与可能的字符串匹配:
先看该词元是否匹配任何已知的时区缩写。这些缩写由 Section B.4 中描述的配置设置决定。
如果没有找到,则搜索内部表,将该词元识别为特殊字符串(例如 today)、星期名(例如 Thursday)、月份名(例如 January)或噪声词(例如 at、on)。
如果仍然没有找到,则抛出错误。
当词元是一个数字或数字字段时:
如果有八位或六位数字,并且之前还没有读取到其他日期字段,则将其解释为“拼接式日期”(例如 19990118 或 990118)。其解释方式分别为 YYYYMMDD 或 YYMMDD。
如果词元是三位数字,并且已经读取到了年份,则将其解释为一年中的第几天。
如果是四位或六位数字,并且已经读取到了年份,则将其解释为时间(HHMM 或 HHMMSS)。
如果有三位或更多位数字,并且尚未找到任何日期字段,则将其解释为年份(这会强制其余日期字段按 yy-mm-dd 的顺序解释)。
否则,假定日期字段顺序遵循 DateStyle 设置:mm-dd-yy、dd-mm-yy 或 yy-mm-dd。如果发现月份字段或日字段超出范围,则抛出错误。
如果指定了 BC,则将年份取反并加一后再用于内部存储。(格里高利历中没有 0 年,因此从数值上说,公元前 1 年会变成年 0。)
如果未指定 BC,并且年份字段长度为两位,则将年份调整为四位。如果该字段小于 70,则加 2000,否则加 1900。
可以通过带前导零的四位数字来输入公元 1–99 年(例如,0099 表示公元 99 年)。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。