首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 日期函數完整參考:SYSDATE、ADD_MONTHS、TRUNC 等常用函數詳解

     編輯:Oracle 資料庫相關知識

核心日期函數速查表

函數用途語法範例說明
SYSDATE取得資料庫伺服器當前日期時間SELECT SYSDATE FROM dual;含時分秒,精確到秒
CURRENT_DATE取得 Session 時區的當前日期SELECT CURRENT_DATE FROM dual;受 SESSIONTIMEZONE 影響
SYSTIMESTAMP取得伺服器時間戳記 (含微秒/時區)SELECT SYSTIMESTAMP FROM dual;TIMESTAMP WITH TIME ZONE 型別
TRUNC(date)截去時間部分,回傳午夜 00:00:00TRUNC(SYSDATE)常用於日期比較、分組
ROUND(date)四捨五入到最近的日期/月/年ROUND(SYSDATE, 'MONTH')格式模型參見下表
ADD_MONTHS加減月份ADD_MONTHS(SYSDATE, 3)負數為減月,自動處理月末
MONTHS_BETWEEN計算兩日期相差月數MONTHS_BETWEEN(d1, d2)d1 > d2 為正,含小數部分
LAST_DAY取得該月最後一天LAST_DAY(SYSDATE)自動處理閏年
NEXT_DAY取得指定週名之後的第一個日期NEXT_DAY(SYSDATE, 'FRIDAY')週名依 NLS_DATE_LANGUAGE
EXTRACT擷取日期欄位 (YEAR/MONTH/DAY/HOUR...)EXTRACT(MONTH FROM SYSDATE)回傳 NUMBER
NEW_TIME跨時區轉換 (舊函數)NEW_TIME(d, 'PST', 'EST')建議改用 TIMESTAMP WITH TIME ZONE
TO_CHAR日期轉字串TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')格式模型見下
TO_DATE字串轉日期TO_DATE('2023-07-15', 'YYYY-MM-DD')格式模型見下

常用日期格式模型

模型意義範例輸出
YYYY4 位數年份2023
MM2 位數月份07
MON月份縮寫JUL
DD月份中的第幾天15
DAY星期名稱SATURDAY
HH2424 小時制小時14
MI分鐘30
SS秒45
FF3毫秒 (3 位)123
TZH:TZM時區位移+08:00

實用範例集

1. 本月第一天 / 最後一天

TRUNC(SYSDATE, 'MM')                    -- 本月 1 號 00:00:00
LAST_DAY(TRUNC(SYSDATE, 'MM'))          -- 本月最後一天 00:00:00

2. 計算年齡 / 年齡分組

FLOOR(MONTHS_BETWEEN(SYSDATE, birth_date) / 12) AS age_years
TRUNC(MONTHS_BETWEEN(SYSDATE, birth_date) / 12, -1) * 10 AS age_group_10

3. 找出下個工作日 (排除週末)

CASE TO_CHAR(NEXT_DAY(dt, 'FRIDAY'), 'DY')
  WHEN 'SAT' THEN NEXT_DAY(dt, 'MONDAY')
  WHEN 'SUN' THEN NEXT_DAY(dt, 'MONDAY')
  ELSE NEXT_DAY(dt, 'FRIDAY')
END

4. 時區轉換 (11g+ 推薦)

CAST(FROM_TZ(CAST(local_dt AS TIMESTAMP), 'Asia/Taipei') 
     AT TIME ZONE 'UTC' AS DATE) AS utc_dt

5. 日期區間產生器 (連續日期)

SELECT TRUNC(SYSDATE) + LEVEL - 1 AS dt
FROM dual
CONNECT BY LEVEL <= 30;  -- 產生未來 30 天

常見陷阱與最佳實務

  • 隱含轉換: 絕不依賴 `WHERE date_col = '15-JUL-23'`,務必用 `TO_DATE` 或 `DATE '2023-07-15'`
  • 索引失效: `WHERE TRUNC(date_col) = TRUNC(SYSDATE)` 會導致索引無法使用,改用 `WHERE date_col >= TRUNC(SYSDATE) AND date_col < TRUNC(SYSDATE)+1`
  • NLS 相依: `TO_CHAR` 月份名稱、星期名稱受 `NLS_DATE_LANGUAGE` 影響,跨環境請明確指定 `'NLS_DATE_LANGUAGE=AMERICAN'`
  • 閏秒/夏令: 跨時區計算請改用 `TIMESTAMP WITH TIME ZONE` + `AT TIME ZONE`,避免 `NEW_TIME` 缺陷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved