9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面

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

日期/时间类型输入都使用下面的过程解码。

  1. 将输入字符串打断成记号并且把每一个记号分类为一个字符串、时间、时区或数字。

    1. 如果数字记号包含一个分号(:),那么这是一个时间字符串。包括所有后续数位和分号。

    2. 如果数字记号包含一个连字符(-)、斜线(/)或两个以上的句点(.),那么这是一个日期字符串,它可能含有一个文本形式的月份。如果一个日期记号已经被看到,它会转而被解释为一个时区名(例如America/New_York)。

    3. 如果记号只是数字,那么它要么是一个单一域,要么是一个 ISO 8601 串连日期(例如 1999年1月13日是19990113)或时间(例如 14:15:16 是141516)。

    4. 如果记号以一个加号(+)或减号(-)开始,那么它要么是一个数字的时区,要么是一个特殊域。

  2. 如果记号是一个文本字符串,使之匹配可能的串:

    1. 对作为一个时区缩写的记号做一次二分法表查找。

    2. 如果没有找到,做一次类似的二分法表查找来将该记号匹配为一个特殊串(例如today)、日(例如Thursday)、月(例如January)或噪音词(例如aton)。

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

  3. 当记号是一个数字或数字域时:

    1. 如果有 8 位或 6 位,并且之前没有读到其他日期域,那么解释为一个串连日期(例如19990118990118)。翻译是YYYYMMDDYYMMDD

    2. 如果记号是 3 位并且已经读到了一个年域,那么解释为一年中的第几日。

    3. 如果是 4 位或 6 位并且已经读到了一个年域,那么解释为一个时间域(HHMMHHMMSS)。

    4. 如果是 3 位或更多位并且还没有读到日期域,解释为一个年域(这会强制剩余日期域的 yy-mm-dd 顺序)。

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

  4. 如果已经指定了 BC ,对年求反并且加一用于内部存储(在格里高利历中没有 0 年,因此数字的 1 BC 就是 0 年)。

  5. 如果没有指定 BC ,并且如果该年域长度为两位,那么把该年域调整为四位。如果该域小于 70,则增加 2000,否则增加 1900。

    提示

    格里高利年 AD 1-99 可以使用带有前导零的 4 位形式录入(例如0099是 AD 99)。