Appendix A. 日期/時間支援

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

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

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

A.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,則對年份取其負數並加一,用於內部保存。 (在格裡高利歷法裡沒有零年,所以數位上的 1BC 是公元零年。)

  5. 如果沒有宣告 BC,並且年份欄位有兩個資料位的長度, 那麼把年份調整為 4 位。如果該欄位小於 70,那麼加 2000﹔否則,加 1900。

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