本文整理自 PostgreSQL 9.1.15 官方文檔第 9.9 章,詳細介紹日期/時間數據類型的運算子、函數、時區轉換、當前時間獲取及延遲執行等功能,為開發者提供完整參考。
PostgreSQL 支援日期/時間類型與整數、間隔的加減乘除運算。運算子成對出現(如 date + integer 和 integer + date),文檔僅列示一種。主要運算示例:
date '2001-09-28' + integer '7' → date '2001-10-05'date '2001-09-28' + interval '1 hour' → timestamp '2001-09-28 01:00:00'interval '1 day' + interval '1 hour' → interval '1 day 01:00:00'date '2001-10-01' - date '2001-09-28' → integer '3' (天數)900 * interval '1 second' → interval '00:15:00'| 函數 | 返回類型 | 說明 | 示例 |
|---|---|---|---|
age(timestamp, timestamp) | interval | 計算兩時間差,以年月日表示 | age('2001-04-10', '1957-06-13') → 43 years 9 mons 27 days |
current_date | date | 當前日期(事務開始時) | 2001-12-23 |
current_timestamp | timestamp with time zone | 當前日期時間(事務開始時) | 2001-12-23 14:39:53.662522-05 |
date_trunc('hour', timestamp) | timestamp | 截斷到指定精度 | date_trunc('hour', '2001-02-16 20:38:40') → 2001-02-16 20:00:00 |
extract(field FROM source) | double precision | 提取子欄位(年、月、日、時區等) | extract(hour FROM timestamp '2001-02-16 20:38:40') → 20 |
justify_interval(interval) | interval | 調整間隔,結合天數轉月、小時轉日 | justify_interval('1 mon -1 hour') → 29 days 23:00:00 |
now() | timestamp with time zone | 等同於 current_timestamp | - |
pg_sleep(seconds) | void | 延遲執行指定秒數 | pg_sleep(1.5) |
EXTRACT 支援的欄位包括:century、day、decade、dow(週日=0)、doy、epoch(Unix 時間戳)、hour、isodow(ISO 週一=1)、isoyear、microseconds、millennium、milliseconds、minute、month、quarter、second、timezone、week(ISO 週數)、year 等。date_part 功能相同,但欄位名需用字串指定。
支援三種變體:
timestamp without time zone AT TIME ZONE zone → 視為指定時區,返回帶時區時間戳timestamp with time zone AT TIME ZONE zone → 轉換為新時區,返回無時區時間戳time with time zone AT TIME ZONE zone → 時區轉換,返回帶時區時間時區可用名稱(如 'PST')或間隔(如 INTERVAL '-08:00')指定。
CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、LOCALTIME、LOCALTIMESTAMP,可帶精度參數transaction_timestamp()(同 CURRENT_TIMESTAMP)、statement_timestamp()(語句開始時)、clock_timestamp()(實際當前時間)、timeofday()(文字格式實際時間)、now()(傳統別名)判斷兩個時間區間是否重疊,語法:(start1, end1) OVERLAPS (start2, end2) 或 (start1, length1) OVERLAPS (start2, length2)。端點可為日期/時間/時間戳,區間為半開半閉 [start, end),僅端點相同不視為重疊。
對帶時區時間戳加減 interval '1 day' 會推進日曆日期,不一定等於 24 小時。例如在 CST7CDT 時區,'2005-04-02 12:00-07' + interval '1 day' 結果為 '2005-04-03 12:00-06',而加 interval '24 hours' 則為 '2005-04-03 13:00-06',因 4 月 3 日 02:00 發生夏令時間切換。
因月份天數不同,age 計算部分月份時以較早日期的月份為準。如 age('2004-06-01', '2004-04-30') 用 4 月(30 天)得 1 mon 1 day,若用 5 月(31 天)則為 1 mon 2 days。