| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
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,則對年份取其負數並加一,用于內部保存。 (在格裡高利歷法裡沒有零年,所以數字上的 1 BC 是公元零年。)
如果沒有聲明 BC,並且年份字段有兩個數據位的長度, 那麼把年份調整為 4 位。如果該字段小于 70,那麼加 2000;否則,加 1900。
提示: 格裡高利年份 AD 1-99可以用前導零的方式使用4位數字 (也就是說,0099 是 AD 99)。以前的 PostgreSQL 版本接受三位數字的年份和一位數字的年份,但是從版本 7.0 開始,這個 規則更嚴格了,以減少可能的混淆。