pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
PostgreSQL 对所有日期/时间输入都使用一个内部的启发式解析器。日期和时间以字符串形式输入,并被拆分为不同的字段,同时初步判断每个字段中可能包含哪类信息。每个字段都会被解释,并被赋予数值、忽略或拒绝。解析器内部为所有文本字段都维护了查找表,包括月份、星期几以及时区。
本附录包含关于这些查找表内容的信息,并描述了解析器解码日期和时间时所使用的步骤。
日期/时间类型都使用一组公共的例程进行解码。
日期/时间输入解释
将输入字符串拆分为词元,并把每个词元归类为字符串、时间、时区或数字。
如果数字词元包含冒号(:),则它是一个时间字符串。把其后的所有数字和冒号都包含进来。
如果数字词元包含连字符(-)、斜杠(/)或两个以上的点(.),则它是一个日期字符串,并且可能带有文本形式的月份。
如果词元仅由数字组成,那么它要么是单个字段,要么是 ISO 8601 的拼接式日期(例如,19990113 表示 1999 年 1 月 13 日)或时间(例如,141516 表示 14:15:16)。
如果词元以加号(+)或减号(-)开头,那么它要么是数字时区,要么是特殊字段。
如果词元是一个纯字母字符串,则将其与可能的字符串匹配:
对该词元做二分查找表匹配,看它是否为特殊字符串(例如 today)、星期名(例如 Thursday)、 月份名(例如 January)或噪声词(例如 at、on)。
设置字段值和字段位掩码。例如,为 today 设置年、月、日,并为 now 额外设置时、分、秒。
如果没有找到,则做一次类似的二分查找表匹配,尝试将该词元与时区匹配。
如果没有找到,则抛出错误。
该词元是一个数字或数字字段。
如果多于 4 位数字,并且之前还没有读取到其他日期字段,则将其解释为“拼接式日期”(例如 19990118)。8 位和 6 位数字被解释为年、月、日,而 7 位和 5 位数字则分别被解释为年、年积日。
如果词元是三位数字并且已经解码了年份,则解释为年积日。
如果是四位或六位数字并且已经读取了年份,则解释为时间。
如果是四位或更多位数字,则解释为年份。
如果处于欧洲日期模式,并且还没有读取日字段,并且该值小于或等于 31,则解释为日。
如果还没有读取月份字段,并且该值小于或等于 12,则解释为月。
如果还没有读取日字段,并且该值小于或等于 31,则解释为日。
如果是两位数字或四位及更多位数字,则解释为年份。
否则,抛出错误。
如果指定了 BC,则将年份取反并加一后再用于内部存储。(格里高利历中没有 0 年,因此从数值上说,1BC 会变成年 0。)
如果没有指定 BC,并且年份字段的长度为两位,则将年份调整为四位。如果该字段小于 70,则加上 2000;否则加上 1900。
格里高利历公元 1-99 年可以使用带前导零的四位数字输入(例如,0099 表示公元 99 年)。以前的 PostgreSQL 版本还接受三位数字和单个数字的年份,但从版本 7.0 开始,这些规则被收紧,以减少出现歧义的可能性。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。