函數概覽
ADD_MONTHS 是 Oracle 核心日期函數之一,專門用於日期加減月份,自動處理月份天數差異、閏年邊界等複雜邏輯。
ADD_MONTHS(date, number_of_months)
date:基準日期(DATE 或 TIMESTAMP 型別)
number_of_months:要加減的月份數,可為正數(未來)、負數(過去)或零
核心特性與自動處理邏輯
| 場景 | 處理邏輯 | 範例 |
| 月末日期 | 若基準日為月末,結果自動調整為目標月最後一天 | 1/31 + 1月 → 2/28(或29) |
| 閏年 2 月 | 自動識別閏年,2/29 存在時保留 | 2024/1/29 + 1月 → 2024/2/29 |
| 跨年運算 | 自動處理年份遞增/遞減 | 12/15 + 2月 → 翌年 2/15 |
| 負數參數 | 向過去推算 | SYSDATE - 6 月 → 半年前 |
實戰範例
基本月份加減
-- 半年前
SELECT ADD_MONTHS(SYSDATE, -6) FROM dual;
-- 半年後
SELECT ADD_MONTHS(SYSDATE, 6) FROM dual;
-- 固定日期運算
SELECT ADD_MONTHS(TO_DATE('2024-01-31', 'YYYY-MM-DD'), 1) FROM dual;
-- 結果:2024-02-29 (2024 為閏年)
SELECT ADD_MONTHS(TO_DATE('2024-01-31', 'YYYY-MM-DD'), 2) FROM dual;
-- 結果:2024-03-31
常見業務場景應用
1. 動態查詢上個月完整資料
-- 需求:查詢上個月完整登入記錄
SELECT DISTINCT mobile
FROM twap_logon
WHERE TO_CHAR(logon_time, 'YYYY-MM') = TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'YYYY-MM');
2. 計費週期/合約到期日計算
-- 合約起始日
SELECT ADD_MONTHS(contract_start_date, contract_duration_months) AS expiry_date
FROM contracts;
3. 固定帳單日處理
-- 每月 5 號出帳單,計算下一個帳單日
SELECT CASE
WHEN DAY(SYSDATE) <= 5 THEN TRUNC(SYSDATE, 'MM') + 4
ELSE ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1) + 4
END AS next_billing_date
FROM dual;
進階技巧與注意事項
搭配 TRUNC 進行月首/月尾運算
-- 本月第一天 00:00:00
SELECT TRUNC(SYSDATE, 'MM') FROM dual;
-- 本月最後一天 23:59:59
SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1) - INTERVAL '1' SECOND FROM dual;
-- 或
SELECT LAST_DAY(SYSDATE) + INTERVAL '23:59:59' HOUR TO SECOND FROM dual;
與間隔運算對比
| 操作 | 語法 | 特點 |
| 加減月份 | ADD_MONTHS(d, n) | 智慧處理月末、閏年,返回 DATE |
| 加減年月間隔 | d + INTERVAL 'n' MONTH | ANSI 標準,返回 TIMESTAMP WITH LOCAL TIME ZONE,精度更高 |
| 加減天數 | d + n 或 d + INTERVAL 'n' DAY | 簡單天數運算 |
效能考量
ADD_MONTHS 為內建 C 函數,執行極快,適合大量資料處理
- 避免在 WHERE 條件中對欄位使用函數(如
WHERE ADD_MONTHS(col, 1) > SYSDATE),會導致索引失效
- 改寫為:
WHERE col > ADD_MONTHS(SYSDATE, -1)
相關函數快速查閱
| 函數 | 用途 |
LAST_DAY(date) | 返回該月最後一天 |
MONTHS_BETWEEN(date1, date2) | 計算兩日期相差月份(含小數) |
NEXT_DAY(date, '星期') | 返回指定星期的下一個日期 |
TRUNC(date, 'MM') | 截斷到月首 |
總結
ADD_MONTHS 是處理月份運算的首選函數,其智慧邊界處理(月末調整、閏年識別)極大簡化了業務邏輯。掌握其與 TRUNC、LAST_DAY、INTERVAL 的組合運用,能優雅解決帳單週期、合約管理、報表時段等常見日期計算需求。