傳統 NUMBER(秒) 或 DATE 差值計算困難(60 進制、月長短不一)。Oracle 9i+ 引入 SQL:1999 標準:
INTERVAL YEAR TO MONTH:年月間隔;INTERVAL DAY TO SECOND:天/時/分/秒/分秒間隔,支援小數秒精度。| 類型 | 精度 | 時區支援 |
|---|---|---|
| TIMESTAMP | 分秒(默認 6 位微秒) | 無 |
| TIMESTAMP WITH TIME ZONE | 分秒 + 時區偏移 | 有(存儲時區) |
| TIMESTAMP WITH LOCAL TIME ZONE | 分秒 + 會話時區自動轉換 | 有(正規化存儲) |
| 需求 | SQL |
|---|---|
| 系統時間 + 5 秒 | SYSDATE + INTERVAL '5' SECOND |
| 系統時間 + 5 分鐘 | SYSDATE + INTERVAL '5' MINUTE |
| 系統時間 + 5 小時 | SYSDATE + INTERVAL '5' HOUR |
| 系統時間 + 5 天 | SYSDATE + 5 |
| 系統時間 - 5 月 | ADD_MONTHS(SYSDATE, -5) |
| 系統時間 - 5 年 | ADD_MONTHS(SYSDATE, -60) |
| 上月末日期 | LAST_DAY(ADD_MONTHS(SYSDATE, -1)) |
| 本月最後一秒 | TRUNC(ADD_MONTHS(SYSDATE,1),'MM') - INTERVAL '1' SECOND |
| 本周一日期 | 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') |
-- 記錄最大時間 + 14 月 > 當前時間 → 有效(1),否則無效(0)
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;
TO_CHAR(created,'YYYYMMDD') = '20240101'),改用範圍查詢(created >= DATE '2024-01-01' AND created < DATE '2024-01-02');INTERVAL 字面量而非數字除法,可讀性與精度雙贏。