| 函數 | 用途 | 回傳型別 | 範例 |
|---|---|---|---|
| ADD_MONTHS(d, n) | 日期加減月份 | DATE | `ADD_MONTHS(SYSDATE, 12)` → 明年今日 |
| CURRENT_DATE | Session 時區當前日期 | DATE | 受 `ALTER SESSION SET TIME_ZONE` 影響 |
| CURRENT_TIMESTAMP(p) | Session 時區當前 Timestamp | TIMESTAMP 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 TZ | TIMESTAMP WITH TIME ZONE | 精確至微秒,含時區 |
| SESSIONTIMEZONE | 當前 Session 時區位移 | VARCHAR2 | `+08:00` |
-- 日期 + 數字 = 日期 (天數)
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'
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 (天文曆日數)
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')
-- 判斷閏年
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)
-- 年月間隔
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
Oracle 提供豐富的日期時間函數族群,掌握 `ADD_MONTHS`、`EXTRACT`、`TRUNC/ROUND`、`INTERVAL` 運算、`TIMESTAMP WITH TIME ZONE` 類型,能優雅解決 99% 的日期業務邏輯。建立專案統一的「日期處理規範」(儲存型別、時區策略、格式化標準) 是避免 Bug 的關鍵。