PostgreSQL 使用一個內部的啟發式分析器 用於所有的日期/時間支援.日期和時間都是以字串形式輸入的, 然後用一個初步的判斷分解為在該數域裡可以有什麼樣的資訊. 每個數域都被解釋,並且要麼是被賦予一個數位值,要麼是忽略, 要麼是被拒絕.分析器裡包含內部的查詢表,用於所有純文字域, 包括月份,星期幾,和時區.
這份附錄包含這些查詢表的資訊,以及描述了分析器用來對時間和日期 解碼的步驟.
日期/時間類型都是使用一套通用的過程進行解析的。
日期/時間輸入解析
把輸入字串分解為一個個記號,然後把每個記號分成字串, 時間,時區,或者數位幾類。
如果一個數位記號包含一個冒號(:), 那麼這是一個時間字串。包括隨後所有的資料位和冒號。
如果這個數位記號包含一個劃線(-),斜杠(/), 或者兩個或多個點(.),那麼它就是一個日期字串, 可能有一個純文字月份。
如果這個記號只是數位,那麼它要麼是一個單獨的欄位, 要麼是一個 ISO 8601 連線的日期(比如,19990113 是 1999 年一月 13 日)或者是連線的時間(比如,141516 是 14:15:16)。
如果記號以一個加號(+)開頭或者減號(-)開頭, 那麼它要麼是一個時區,要麼就是一個特殊的欄位。
如果記號是一個純文字字串,那麼和可能的字串進行相符。
做一次二分表尋找,看看這個記號是特殊字串(比如,today), 日期(比如,Thursday),月份(比如,January), 還是一個無關痛痒的字(比如,at,on)。
為欄位設定數值和位遮罩。 比如,為 today 設定年,月,日, 以及為 now 這樣的還需要設定另外的時,分,秒。
如果沒有找到,則做一次類似的二分表搜尋,找與記號相符的時區。
如果還沒有找到,拋出一個錯誤。
記號是一個數位或者數位欄位。
如果超過4位數位,而且前面也沒有讀到其它日期欄位, 那麼就解釋成一個"連線的日期"(比如,19990118)。 8和6位分別解釋成年,月,和日,而7和5位分別解釋成年,年日。
如果記號是三位數位,並且已經解碼了一個年份,那麼解釋成年日。
如果已經讀取了四和六位數位,並且已經讀取了一個年份, 那麼就解釋成時間。
如果是四或更多位,則解析成一個年份。
如果是歐洲日期樣式,並且還未讀取到日期欄位,並且數值小於或等於31, 那麼解析成某一天。
如果還未讀取月份欄位,並且數值小於或等於12,那麼解析成月份。
如果日期域尚未讀取,並且數值小於或等於31,則解析成一天。
如果是兩位或者四或更多位數位,那麼解析成一年。
否則,拋出一個錯誤。
如果宣告了 BC,則對年份取其負數並加一,用於內部保存。 (在格裡高利歷法裡沒有零年,所以數位上的 1BC 是公元零年。)
如果沒有宣告 BC,並且年份欄位有兩個資料位的長度, 那麼把年份調整為 4 位。如果該欄位小於 70,那麼加 2000﹔否則,加 1900。
技巧: 格裡高利年份 AD 1-99可以用前導零的方式使用4位數位 (也就是說,0099 是 AD 99)。以前的 PostgreSQL 版本接受三位數位的年份和一位數位的年份,但是從版本 7.0 開始,這個 規則更嚴格了,以減少可能的混淆。