Appendix B. 日期/時間支持

Table of Contents
B.1. 日期/時間輸入解析
B.2. 日期/時間關鍵字
B.3. 日期單位的歷史

PostgreSQL 使用一個內部的啟發式分析器 用于所有的日期/時間支持.日期和時間都是以字串形式輸入的, 然後用一個初步的判斷分解為在該數域裡可以有什麼樣的信息. 每個數域都被解釋,並且要麼是被賦予一個數字值,要麼是忽略, 要麼是被拒絕.分析器裡包含內部的查詢表,用于所有文本域, 包括月份,星期幾,和時區.

這份附錄包含這些查詢表的信息,以及描述了分析器用來對時間和日期 解碼的步驟.

B.1. 日期/時間輸入解析

日期/時間類型輸入都是使用下列的過程進行解碼的。

  1. 把輸入字串分解為一個個記號,然後把每個記號分成字串, 時間,時區,或者數字幾類。

    1. 如果一個數字記號包含一個冒號(:), 那麼這是一個時間字串。包括隨後所有的數據位和冒號。

    2. 如果這個數字記號包含一個劃線(-),斜槓(/), 或者兩個或多個點(.),那麼它就是一個日期字串, 可能有一個文本月份。

    3. 如果這個記號只是數字,那麼它要麼是一個單獨的字段, 要麼是一個 ISO 8601 連接的日期(比如,19990113 是 1999 年一月 13 日)或者是連接的時間(比如,141516 是 14:15:16)。

    4. 如果記號以一個加號(+)開頭或者減號(-)開頭, 那麼它要麼是一個時區,要麼就是一個特殊的字段。

  2. 如果記號是一個文本字串,那麼和可能的字串進行匹配。

    1. 做一次二分表查找,看看這個記號是特殊字串(比如,today), 日期(比如,Thursday),月份(比如,January), 還是一個無關痛癢的字(比如,aton)。

      為字段設置數值和位掩碼。 比如,為 today 設置年,月,日, 以及為 now 這樣的還需要設置另外的時,分,秒。

    2. 如果沒有找到,則做一次類似的二分表搜索,找與記號匹配的時區。

    3. 如果還沒有找到,拋出一個錯誤。

  3. 記號是一個數字或者數字字段。

    1. 如果超過4位數字,而且前面也沒有讀到其它日期字段, 那麼就解釋成一個"連接的日期"(比如,19990118)。 8和6位分別解釋成年,月,和日,而7和5位分別解釋成年,年日。

    2. 如果記號是三位數字,並且已經解碼了一個年份,那麼解釋成年日。

    3. 如果已經讀取了四和六位數字,並且已經讀取了一個年份, 那麼就解釋成時間。

    4. 如果是四或更多位,則解析成一個年份。

    5. 如果是歐洲日期模式,並且還未讀取到日期字段,並且數值小于或等于31, 那麼解析成某一天。

    6. 如果還未讀取月份字段,並且數值小于或等于12,那麼解析成月份。

    7. 如果日期域尚未讀取,並且數值小于或等于31,則解析成一天。

    8. 如果是兩位或者四或更多位數字,那麼解析成一年。

    9. 否則,拋出一個錯誤。

  4. 如果聲明了 BC,則對年份取其負數並加一,用于內部保存。 (在格裡高利歷法裡沒有零年,所以數字上的 1 BC 是公元零年。)

  5. 如果沒有聲明 BC,並且年份字段有兩個數據位的長度, 那麼把年份調整為 4 位。如果該字段小于 70,那麼加 2000;否則,加 1900。

    提示: 格裡高利年份 AD 1-99可以用前導零的方式使用4位數字 (也就是說,0099 是 AD 99)。以前的 PostgreSQL 版本接受三位數字的年份和一位數字的年份,但是從版本 7.0 開始,這個 規則更嚴格了,以減少可能的混淆。