| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
PostgreSQL 使用一個內部的啟髮式分析器用於所有的日期/時間支援。 日期和時間都是以字串形式輸入的,然後用一個初步的判斷分解為在該數域裡可以有什麼樣的訊息。 每個數域都被解釋,並且要麼是被賦予一個數字值,要麼是忽略, 要麼是被拒絕。分析器裡包含內部的查詢資料表,用於所有文本域,包括月份,星期幾,和時區。
這份附錄包含這些查詢資料表的訊息,以及描述了分析器用來對時間和日期解碼的步驟。
日期/時間類型輸入都是使用下列的過程進行解碼的。
把輸入字串分解為一個個記號,然後把每個記號分成字串,時間,時區,或者數字幾類。
如果一個數字記號包含一個冒號(:),那麼這是一個時間字串。包括隨後所有的資料位和冒號。
如果這個數字記號包含一個劃線(-),斜槓(/), 或者兩個或多個點(.),那麼它就是一個日期字串,可能有一個文本月份。
如果這個記號只是數字,那麼它要麼是一個單獨的字串, 要麼是一個 ISO 8601 連接的日期(比如,19990113 是 1999 年一月 13 日)或者是連接的時間(比如,141516 是 14:15:16)。
如果記號以一個加號(+)開頭或者減號(-)開頭, 那麼它要麼是一個時區,要麼就是一個特殊的字串。
如果記號是一個文本字串,那麼和可能的字串進行匹配。
做一次二分資料表查找,看看這個記號是特殊字串(比如,today), 日期(比如,Thursday),月份(比如,January), 還是一個無關痛癢的字(比如,at,on)。
為字串設置數值和位掩碼。比如,為 today 設置年,月,日, 以及為 now 這樣的還需要設置另外的時,分,秒。
如果沒有找到,則做一次類似的二分資料表搜索,找與記號匹配的時區。
如果還沒有找到,拋出一個錯誤。
記號是一個數字或者數字字串。
如果有八位或者六位數字,而且前面也沒有讀到其它日期字串, 那麼就解釋成一個"連接的日期"(比如, 19990118 或者 990118)。 這裡的解析是 YYYYMMDD 或者 YYMMDD。
如果記號是三位數字,並且已經解碼了一個年份,那麼解釋成年日。
如果已經讀取了四和六位數字,並且已經讀取了一個年份, 那麼就解析成時間(HHMM 或者 HHMMSS)。
如果是三位或更多位並且還沒有找到日期字串,則解析成一個年份 (這個解析強制剩餘的日期字串的順序為 yy-mm-dd)。
那麼解析成某一天。 否則,日期字串的順序被認為是尊循 DateStyle 設置: mm-dd-yy,dd-mm-yy,或者 yy-mm-dd。如果發現月份或者日期字串超出範圍, 則拋出一個錯誤。
如果聲明了 BC,則對年份取其負數並加一,用於內部保存。 (在格裡高利曆法裡沒有零年,所以數字上的 1 BC 是公元零年。)
如果沒有聲明 BC,並且年份字串有兩個資料位的長度, 那麼把年份調整為 4 位。如果該字串小於 70,那麼加 2000;否則,加 1900。
提示: 格裡高利年份 AD 1-99可以用前導零的方式使用4位數字 (也就是說,0099 是 AD 99)。 以前的 PostgreSQL 版本接受三位數字的年份和一位數字的年份, 但是從版本 7.0 開始,這個規則更嚴格了,以減少可能的混淆。