PostgreSQL
上一頁 第三章. 數據型態 下一頁

日期/時間型態

PostgreSQL 支援 SQL 中所有的日期和時間型態。

表 3-7. Postgres 日期/時間 型態

型態 描述 儲存 最早 最晚 精度
timestamp 用於包含日期和時間的數據 8 bytes 4713 BC AD 1465001 1 microsec / 14 digits
interval 用於時間間隔 12 bytes -178000000 years 178000000 years 1 mircosecond
date 用於只包含日期的數據 4 bytes 4713 BC 32767 AD 1 day
time 用於只包含時刻的數據 4 bytes 00:00:00.00 23:59:59.99 1 microsecond

注意:為了保証和早期 PostgreSQL 版本的兼容,我們還繼續提供 datetime(等效於timestamp)和timespan(等效於interval)。型態abstimereltime 是底分辨率型態,它們被用於系統內部。我們不鼓勵你在新的應用裡面使用這些型態,同時我們支援合適的時候把舊應用中對應的型態轉換成目前上面指明的。因為這些舊型態的部分或全部在未來的版本裡可能消失。

日期/時間輸入

日期和時間的輸入幾乎可以是任何合理的格式,包括ISO-兼容的,SQL-兼容的,傳統 Postgres 的和其他形式的。日期輸入裡的月份和日子輸入可以是模糊的,因此存在一個設置用來表明具體應該如何解釋。命令 SET DateStyle TO 'US'SET DateStyle TO 'NonEuropean' 表示設置為“月份在日子前面”,而命令 SET DateStyle TO 'European' 表示設置為“日子在月份前面”。預設是前者。

參閱 日期/時間 支援 獲取關於日期/時間輸入的準確的分析規則和可識別的時區的資訊。

記住任何日期或者時間輸入需要被單引號包圍,就像一個文本字符串一樣。

date(日期

下表是 date 型態可能的輸入方式。

表 3-8. PostgreSQL 日期輸入

例子 描述
January 8, 1999 無模糊
1999-01-08 ISO-8601 格式,建議方式
1/8/1999 US﹔在 European 模式下讀做八月一日
8/1/1999 European﹔在 US 模式下讀做八月一日
1/18/1999 US﹔在任何模式下都讀做一月十八日
1999.008 年和年裡的第幾天
19990108 ISO-8601 年,月,日
990108 ISO-8601 年,月,日
1999.008 年和年裡的第幾天
99008 年和年裡的第幾天
January 8, 99 BC 公元前99年

表 3-9. PostgreSQL 月份縮寫

月份 縮寫
April(四月) Apr
August(八月) Aug
December(十二月) Dec
February(二月) Feb
January(一月) Jan
July(七月) Jul
June(六月) Jun
March(三月) Mar
November(十一月) Nov
October(十月) Oct
September(九月) Sep, Sept

注意: 五月(May)沒有縮寫,原因是顯而易見的。

表 3-10. PostgreSQL 星期縮寫

星期 縮寫
Sunday(星期天) Sun
Monday(星期一) Mon
Tuesday(星期二) Tue, Tues
Wednesday(星期三) Wed, Weds
Thursday(星期四) Thu, Thur, Thurs
Friday(星期五) Fri
Saturday(星期六) Sat

time(時間

下面是有效的 time (時間)輸入

表 3-11. PostgreSQL 時間輸入

例子 描述
04:05:06.789 ISO-8601,所有的時間域
04:05:06 ISO-8601
04:05 ISO-8601
040506 ISO-8601
04:05 AM 與04:05一樣﹔AM 不影響數值
04:05 PM 與 16:05一樣﹔輸入小時數必須 <= 12
z 與 00:00:00 一樣
zulu 與 00:00:00 一樣
allballs 與 00:00:00 一樣

timestamp(時標)

有效的 timestamp 型態的輸入包含一個日期和一個時間的連接,後面跟著可選的 ADBC,再後面跟著可選的時區。(參閱下面。)因此

1999-01-08 04:05:06 -8:00

是一個有效的 timestamp 值,它是 ISO-兼容的。另外,已經廣泛使用的格式

January 8 04:05:06 1999 PST

也是支援的。

表 3-12. PostgreSQL 時區輸入

時區 描述
PST 太平洋標準時間(Pacific Standard Time)
-8:00 ISO-8601 與 PST 的偏移
-800 ISO-8601 與 PST 的偏移
-8 ISO-8601 與 PST 的偏移

interval(時間間隔)

interval 可以用下面語法聲明:

  Quantity Unit [Quantity Unit...] [Direction]
@ Quantity Unit [Direction]

這裡:Quantity 是 ...,-1012,...﹔Unitsecondminutehourdayweekmonthyeardecadecenturymillenium,或者這些單位的縮寫或復數﹔Direction 可以是 ago 或者為空。

特殊值

下面的SQL-兼容的函數可以用於對應的數據型態的日期或時間輸入:CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP

PostgreSQL 為方便期間同樣還支援幾個特殊常量。

表 3-13. PostgresSQL 日期/時間 特殊常量

常量 描述
current 當前事務時間, (使用時)deferred
epoch 1970-01-01 00:00:00+00 (Unix 系統零時)
infinity 比任何有效時間晚
-infinity 比任何有效時間早
invalid 非法輸入
now 當前事務時間
today 今日午夜
tomorrow 明日午夜
yesterday 昨日午夜

'now' 在該值被插入時解釋,'current' 在每次檢索該值時被解釋。所以你可能會在大多數應用裡使用 'now'。(當然你真的想用 CURRENT_TIMESTAMP 的話也行,它等效於 'now'。)

日期/時間輸出

使用 SET DateStyle,輸出格式可以設成四種風格之一: ISO-8601, SQL (Ingres),傳統的 Postgres, 和 German 風格。預設是 ISO 格式。

表 3-14. PostgreSQL 日期/時間 輸出風格

風格描述 描述 例子
'ISO' ISO-8601 標準 1997-12-17 07:37:16-08
'SQL' 傳統風格 12/17/1997 07:37:16.00 PST
'Postgres' 原始風格 Wed Dec 17 07:37:16 1997 PST
'German' 地區風格 17.12.1997 07:37:16.00 PST

日期時間風格的輸出當然只是對應上面例子的日期或者時間部分。

SQL 風格有歐洲和非歐洲(US)變種, 決定月份後面是日期還是正相反。(參閱上面日期/時間輸入部分,看看這個設置是如何影響對輸入值的解釋。)

表 3-15. PostgreSQL 日期順序傳統

風格描述 例子  
European 17/12/1997 15:37:16.00 MET  
US 12/17/1997 07:37:16.00 PST  

interval 的輸出看起來像輸入格式,只是像 weekcentury 這樣的單位被轉換成年和日。在 ISO 模式下輸出看起來像

[ Quantity Units [ ... ] ] [ Days ] Hours:Minutes [ ago ]

有幾種方法可以影響日期/時間型態的輸出:

時區

Postgres 在典型應用中盡可能與SQL92 的定義相兼容。但 SQL92 標準在日期和時間型態和功能上有一些奇怪的混淆。兩個顯而易見的問題是:

然而,現實世界的時區只有在與時間和日期都關聯時才有意義,因為時間偏移量(時差)可能因為實行類似夏時制這樣的制度而在一年裡有所變化。

為了克服這些困難, Postgres 只將日期和時間型態(同時包含日期和時間)與時區相關聯,並且假設任何型態的當地時間只包含日期或時間。另外,時區的支援從作業系統的時區功能中引入,這樣就可以處理夏時制或其他可知的因素。

Postgres 從作業系統獲得介於1902年和2038年的日期的時區支援(近乎是典型的Unix類系統的日期限制)。在這個範圍之外的日期都假設為用全球統一時間(Universal Coordinated Time,UTC)聲明和使用。

在系統內部,所有日期和時間都是用全球統一時間(UTC)格式儲存,也就是通常所說的格林威治時間(GMT)。時間在發給客戶前端前由資料庫伺服器轉換成本地時間,因而預設的時區是伺服器的時區。

有幾種影響時區特性的方法:

如果使用了非法的時區,時區變為GMT(在大多數系統上)。

注意:如果設置了編譯選項 USE_AUSTRALIAN_RULES,那麼 EST 代表澳大利亞東部標準時間,( Australia Eastern Std Time)與UTC有 +10:00 小時的偏移量。

內部

Postgres 用 Julian 記日法用於所有日期/時間計算。如果假設一年的長度是365.2425天時,這個方法可以很精確地預計/計算從4713BC(公元前4713年)到很久的未來的任意一天的日期。

19世紀以前的日期傳統(歷法)對一些趣味讀物有意義,但是在我們這裡好像沒有充分的理由把它們編碼入日期/時間控制器裡面去。


上一頁 首頁 下一頁
字符型態 開頭 布爾型態