核心函數速查
| 函數 | 語法 | 說明 | 範例 |
SYSDATE | - | 伺服器當前日期時間 | SELECT SYSDATE FROM dual |
TRUNC(date) | TRUNC(dt [,fmt]) | 截斷時間部分(歸零至日) | TRUNC(SYSDATE) |
ADD_MONTHS | ADD_MONTHS(dt, n) | 加減 n 個月,自動處理月末邊界 | ADD_MONTHS('2024-01-31', 1) → 2024-02-29 |
LAST_DAY | LAST_DAY(dt) | 回傳該月最後一天 | LAST_DAY('2024-02-15') → 2024-02-29 |
MONTHS_BETWEEN | MONTHS_BETWEEN(dt1, dt2) | 兩日期相差月數(含小數) | MONTHS_BETWEEN('2024-12-31','2024-01-01') → 11.97 |
NEXT_DAY | NEXT_DAY(dt, '星期') | 下一個指定週幾的日期 | NEXT_DAY(SYSDATE, 'FRIDAY') |
ROUND(date) | ROUND(dt [,fmt]) | 日期四捨五入(時≥12 進位) | ROUND(SYSDATE, 'MM') |
實戰場景範例
1. 避免時間部分干擾日期比對
-- 錯誤:若 p_date 含時間,不會匹配
WHERE p_date = '2024-01-15'
-- 正確:截斷時間
WHERE TRUNC(p_date) = DATE '2024-01-15'
2. 計算員工任職月數
SELECT ename, hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)) AS months_worked
FROM emp;
3. 取得本月第一天、最後一天
SELECT TRUNC(SYSDATE, 'MM') AS first_day,
LAST_DAY(SYSDATE) AS last_day
FROM dual;
4. 產生未來 12 個月首日清單(報表維度)
SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), LEVEL-1) AS month_start
FROM dual
CONNECT BY LEVEL <= 12;
5. 計算下一個發薪日(每月 25 號)
SELECT CASE
WHEN TO_CHAR(SYSDATE, 'DD') <= '25'
THEN TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM') || '-25', 'YYYY-MM-DD')
ELSE ADD_MONTHS(TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM') || '-25', 'YYYY-MM-DD'), 1)
END AS next_payday
FROM dual;
日期運算小技巧
DATE + NUMBER:加天數(SYSDATE + 7 = 一週後)。
DATE - DATE:相差天數(含小數)。
INTERVAL 語法(10g+):
SYSDATE + INTERVAL '7' DAY、SYSDATE - INTERVAL '3' MONTH、SYSDATE + INTERVAL '2 12:30' DAY TO MINUTE。
常見陷阱
ADD_MONTHS 在月末會自動調整至目標月最後一天(1/31 + 1月 → 2/28 或 2/29),不可假設日數不變。
MONTHS_BETWEEN 回傳數值可能為負(第一參數較早),需自行取絕對值。
- 隱含轉換風險:
WHERE dt = '2024-01-15' 依賴 NLS_DATE_FORMAT,建議用 ANSI 日期常值 DATE '2024-01-15'。