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

Oracle 日期函數完整參考指南

     編輯:Oracle 資料庫基礎

常用日期函數分類速查

函數用途回傳型別範例
ADD_MONTHS(d, n)日期加減月份DATE`ADD_MONTHS(SYSDATE, 12)` → 明年今日
CURRENT_DATESession 時區當前日期DATE受 `ALTER SESSION SET TIME_ZONE` 影響
CURRENT_TIMESTAMP(p)Session 時區當前 TimestampTIMESTAMP WITH TIME ZONE含時區位移,精度 p (0-9,預設 6)
DBTIMEZONE資料庫時區位移VARCHAR2`+00:00` 或 `-07:00`
EXTRACT(field FROM src)擷取日期/間隔欄位值NUMBER`EXTRACT(MONTH FROM SYSDATE)` → 11
LAST_DAY(d)該月最後一天日期DATE`LAST_DAY('2000-02-01')` → 2000-02-29 (閏年)
LOCALTIMESTAMP(p)Session 時區當前 Timestamp (無時區)TIMESTAMP不含時區資訊
MONTHS_BETWEEN(d1, d2)兩日期間月數差NUMBER可為負數,含小數部分 (天/31)
NEXT_DAY(d, weekday)給定日期之後下一個指定週幾DATE`NEXT_DAY(SYSDATE, 'FRIDAY')`
NEW_TIME(d, z1, z2)時區轉換 (舊函數)DATE`NEW_TIME(SYSDATE, 'GMT', 'PST')`
ROUND(d, fmt)日期四捨五入 (至日/月/年)DATE`ROUND(SYSDATE, 'MONTH')` → 本月 1 號
TRUNC(d, fmt)日期截斷 (捨去時/分/秒)DATE`TRUNC(SYSDATE)` → 今日 00:00:00
SYSDATE資料庫伺服器作業系統日期時間DATE不含時區,精確至秒
SYSTIMESTAMP資料庫伺服器 Timestamp with TZTIMESTAMP WITH TIME ZONE精確至微秒,含時區
SESSIONTIMEZONE當前 Session 時區位移VARCHAR2`+08:00`

實用範例與技巧

1. 日期運算

-- 日期 + 數字 = 日期 (天數)
SYSDATE + 7           -- 一週後
SYSDATE - 1/24        -- 一小時前
SYSDATE + 30/1440     -- 30 分鐘後

-- 兩日期相減 = 天數 (含小數)
SYSDATE - HIREDATE    -- 受雇天數

-- 月份運算專用 ADD_MONTHS (自動處理月末邊界)
ADD_MONTHS('2023-01-31', 1) → '2023-02-28' (非閏年)
ADD_MONTHS('2023-01-31', -1) → '2022-12-31'

2. 日期格式化輸出 (TO_CHAR)


TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')   -- 2023-11-13 14:30:05
TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日"')    -- 2023年11月13日
TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=AMERICAN') -- MONDAY
TO_CHAR(SYSDATE, 'D')                       -- 週幾 (1-7,週日=1)
TO_CHAR(SYSDATE, 'IW')                      -- ISO 週數 (1-53)
TO_CHAR(SYSDATE, 'WW')                      -- 年內週數
TO_CHAR(SYSDATE, 'DDD')                     -- 年內天數 (1-366)
TO_CHAR(SYSDATE, 'J')                       -- Julian Day (天文曆日數)

3. 字串轉日期 (TO_DATE / TO_TIMESTAMP)


TO_DATE('2023-11-13', 'YYYY-MM-DD')
TO_TIMESTAMP('2023-11-13 14:30:05.123', 'YYYY-MM-DD HH24:MI:SS.FF')
TO_TIMESTAMP_TZ('2023-11-13 14:30:05 +08:00', 'YYYY-MM-DD HH24:MI:SS TZH:TZM')

4. 時區處理最佳實踐

  • 資料庫層:儲存 `TIMESTAMP WITH TIME ZONE` 或統一儲存 UTC (`SYSTIMESTAMP AT TIME ZONE 'UTC'`)。
  • 應用層:Session 級設定 `ALTER SESSION SET TIME_ZONE = '+08:00'` 或連線屬性指定。
  • 顯示層:依用戶偏好時區轉換 `FROM_TZ(TS, 'UTC') AT TIME ZONE 'US/Eastern'`。

5. 閏年/月末邊界計算


-- 判斷閏年
CASE WHEN TO_CHAR(LAST_DAY(TO_DATE('02-'||:YEAR,'MM-YYYY')), 'DD') = '29' THEN 'LEAP' END

-- 本月第一天 / 最後一天
TRUNC(SYSDATE, 'MM')                    -- 本月 1 號 00:00:00
LAST_DAY(TRUNC(SYSDATE, 'MM'))          -- 本月最後一天 00:00:00
LAST_DAY(SYSDATE) + 1 - 1/86400         -- 本月最後一秒 (23:59:59)

6. 間隔運算 (INTERVAL)


-- 年月間隔
SYSDATE + INTERVAL '1' YEAR
SYSDATE - INTERVAL '6' MONTH

-- 日時間隔
SYSDATE + INTERVAL '10' DAY
SYSTIMESTAMP + INTERVAL '2' HOUR

-- 複合間隔
SYSDATE + INTERVAL '1-6' YEAR TO MONTH   -- 1 年 6 月
SYSTIMESTAMP + INTERVAL '10 12:30' DAY TO MINUTE

常見陷阱

  • SYSDATE vs CURRENT_DATE:跨時區應用若用 `SYSDATE` 會導致邏輯錯誤,務必用 `CURRENT_DATE`/`CURRENT_TIMESTAMP`。
  • MONTHS_BETWEEN 非整數:結果含小數 (天數/31),比較月份差建議 `FLOOR(MONTHS_BETWEEN(...))`。
  • NEXT_DAY 參數:週幾需為完整名稱 (`'MONDAY'`) 或縮寫 (`'MON'`),受 `NLS_DATE_LANGUAGE` 影響。
  • DATE 型別無時區:跨時區系統嚴禁用 `DATE` 儲存業務時間,改用 `TIMESTAMP WITH TIME ZONE`。

結語

Oracle 提供豐富的日期時間函數族群,掌握 `ADD_MONTHS`、`EXTRACT`、`TRUNC/ROUND`、`INTERVAL` 運算、`TIMESTAMP WITH TIME ZONE` 類型,能優雅解決 99% 的日期業務邏輯。建立專案統一的「日期處理規範」(儲存型別、時區策略、格式化標準) 是避免 Bug 的關鍵。

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