首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

PostgreSQL 9.1 日期/時間函數與運算子完整指南

     編輯:MySQL 綜合教學

PostgreSQL 9.1 日期/時間函數與運算子完整指南

本文整理自 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_datedate當前日期(事務開始時)2001-12-23
current_timestamptimestamp 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 / date_part 子欄位詳解

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 功能相同,但欄位名需用字串指定。

時區轉換:AT TIME ZONE

支援三種變體:

  • 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')指定。

當前日期/時間函數分類

  • SQL 標準函數(事務開始時固定):CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、LOCALTIME、LOCALTIMESTAMP,可帶精度參數
  • 非標準函數:transaction_timestamp()(同 CURRENT_TIMESTAMP)、statement_timestamp()(語句開始時)、clock_timestamp()(實際當前時間)、timeofday()(文字格式實際時間)、now()(傳統別名)

OVERLAPS 運算子

判斷兩個時間區間是否重疊,語法:(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 計算部分月份時以較早日期的月份為準。如 age('2004-06-01', '2004-04-30') 用 4 月(30 天)得 1 mon 1 day,若用 5 月(31 天)則為 1 mon 2 days。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved