一、SYSDATE 基礎間隔運算(舊版兼容寫法)
| 需求 | 表達式 | 原理 |
| +5 秒 | SYSDATE + 5/24/60/60 | 1天=24*60*60秒 |
| +5 分鐘 | SYSDATE + 5/24/60 | 1天=24*60分 |
| +5 小時 | SYSDATE + 5/24 | 1天=24小時 |
| +5 天 | SYSDATE + 5 | 日期整數=天 |
| -5 月 | ADD_MONTHS(SYSDATE, -5) | 月邊界自動處理 |
| -5 年 | ADD_MONTHS(SYSDATE, -60) | 年轉月 |
二、月/年邊界計算
| 需求 | SQL |
| 上月末日期 | LAST_DAY(ADD_MONTHS(SYSDATE, -1)) |
| 本月最後一秒 | TRUNC(ADD_MONTHS(SYSDATE,1),'MM') - 1/24/60/60 |
| 本周一日期 | TRUNC(SYSDATE,'DAY') + 1 |
| 年初至今天數 | CEIL(SYSDATE - TRUNC(SYSDATE,'YEAR')) |
| 今年第幾周 | TO_CHAR(SYSDATE,'IW') |
| 本月第幾周 | TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 |
| 本月天數 | TO_CHAR(LAST_DAY(SYSDATE),'DD') |
| 今年天數 | ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),12) - TRUNC(SYSDATE,'YEAR') |
| 下周一日期 | NEXT_DAY(SYSDATE,'MONDAY') |
三、高精度時間戳運算(9i+ 推薦)
-- 當前時間含微秒
SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM DUAL;
-- 僅顯示分秒.微秒
SELECT TO_CHAR(CURRENT_TIMESTAMP(9), 'MI:SS.FF') FROM DUAL;
四、業務時間窗口判斷範例
-- 記錄最大時間 + 14 月 > 當前時間 → 有效(1)
SELECT CASE WHEN CURRENT_DATE <
(SELECT ADD_MONTHS(MAX(med_time), 14) FROM red_meetting_record
WHERE med_tar_id='225' AND med_usr_id='001387')
THEN 1 ELSE 0 END AS contains FROM DUAL;
五、性能與最佳實踐
- WHERE 條件禁用函數包裹列:
WHERE TRUNC(created) = SYSDATE → 全表掃描;改用 WHERE created >= TRUNC(SYSDATE) AND created < TRUNC(SYSDATE)+1;
- 分區表按時間列分區時,確保查詢條件類型與分區鍵一致,觸發分區裁剪;
- 批量時間運算優先用
INTERVAL 字面量(SYSDATE + INTERVAL '5' HOUR),可讀性與精度雙贏;
- 跨時區應用統一使用
TIMESTAMP WITH LOCAL TIME ZONE 存儲,應用層僅處理顯示轉換。