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. 如果有八位或者六位數字,而且前面也沒有讀到其它日期字串, 那麼就解釋成一個"連接的日期"(比如, 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,則對年份取其負數並加一,用於內部保存。 (在格裡高利曆法裡沒有零年,所以數字上的 1 BC 是公元零年。)

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

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