PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 B. 日期/时间支持 | 下一页

# B.1. 日期/时间输入解析

日期/时间类型输入都是使用下列过程进行解码的。

1. 把输入的字符串分解为一个个记号，然后把每个记号分成字符串、 时间、时区、数字几类：

   1. 如果一个数字记号包含一个冒号(`:`)， 那么这是一个时间字符串。包括随后所有的数据位和冒号。

   2. 如果这个数字记号包含一个划线(`-`)、斜杠(`/`)、 多个点(`.`)， 那么它就是一个日期字符串，可能有一个文本月份。 如果一个日期记号已经看过，那么将被解析为时区名(比如`America/New_York`)。

   3. 如果这个记号只是数字，那么它要么是一个单独的字段， 要么是一个ISO8601连接的日期(比如`19990113`是1999年1月13日) 或者是连接的时间(比如`141516`是14:15:16)。

   4. 如果记号以一个加号(`+`)或减号(`-`)开头， 那么它要么是一个时区，要么就是一个特殊的字段。

2. 如果记号是一个文本字符串，那么和可能的字符串进行匹配：

   1. 把这个记号当作时区缩写进行二分表查找。

   2. 如果没有找到，再做一次二分表查找，看看这个记号是特殊字符串 (比如`today`)、日期(比如`Thursday`)、 月份(比如`January`)， 还是一个无关痛痒的字 (比如`at`, `on`)。

   3. 如果还没有找到，抛出一个错误。

3. 如果记号是一个数字或者数字字段：

   1. 如果有八位或者六位数字，而且前面也没有读到其它日期字段， 那么就解释成一个"concatenated date(连接的日期)" (比如`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，则对年份取其负数并加一，用于内部保存。 因为在格里高利历法里没有零年，所以数字上的1BC是公元零年。

5. 如果没有声明BC并且年份字段有两个数据位的长度，那么把年份调整为4位。 如果该字段小于70，那么加2000，否则加1900。

   > 提示: 格里高利年份AD 1-99可以用前导零的方式使用4位数字 (也就是说`0099` 是AD 99)。

上一页 | 起始页 | 下一页
日期/时间支持 | 上一级 | 日期/时间关键字