舊版 Oracle 僅有 DATE(秒精度)與 NUMBER 儲存秒數,計算「1 個月後」、「2 年 3 個月」極不直觀。SQL:1999 標準引入 INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND,配合 TIMESTAMP 系列(含時區、分秒小數),解決:
TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE 自動轉換。| 型別 | 語法 | 範例常值 | 適用場景 |
|---|---|---|---|
| INTERVAL YEAR TO MONTH | INTERVAL YEAR[(precision)] TO MONTH | INTERVAL '2-6' YEAR TO MONTH(2 年 6 月) | 合約期限、年齡計算、財務週期 |
| INTERVAL DAY TO SECOND | INTERVAL DAY[(precision)] TO SECOND[(frac_prec)] | INTERVAL '3 12:30:00.123456' DAY TO SECOND | 排程間隔、效能測量、SLA 計算 |
| TIMESTAMP | TIMESTAMP[(frac_prec)] | TIMESTAMP '2024-03-15 14:30:00.123456' | 一般高精度時間點 |
| TIMESTAMP WITH TIME ZONE | TIMESTAMP[(frac_prec)] WITH TIME ZONE | TIMESTAMP '2024-03-15 14:30:00.123456 +08:00' | 跨時區系統、全球化應用 |
| TIMESTAMP WITH LOCAL TIME ZONE | TIMESTAMP[(frac_prec)] WITH LOCAL TIME ZONE | 資料庫時區儲存,查詢自動轉換為 Session 時區 | 統一儲存、前端顯示本地時間 |
-- 字串 → DATE
TO_DATE('2024-03-15', 'YYYY-MM-DD')
TO_DATE('2024-03-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS')
-- 字串 → TIMESTAMP
TO_TIMESTAMP('2024-03-15 14:30:00.123456', 'YYYY-MM-DD HH24:MI:SS.FF6')
-- 字串 → INTERVAL
TO_YMINTERVAL('02-06') -- 2 年 6 月
TO_DSINTERVAL('3 12:30:00.123') -- 3 天 12:30:00.123
-- 日期/時間 → 字串
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3 TZR')
-- 當前高精度時間
CURRENT_TIMESTAMP(6) -- Session 時區
LOCALTIMESTAMP(6) -- DB 時區
SYSTIMESTAMP(6) -- 伺服器作業系統時間
-- 1. 取得「14 個月後」的上限日期
SELECT ADD_MONTHS(MAX(med_time), 14) FROM red_meettingrecord
WHERE med_tar_id = '225' AND med_usr_id = '001387';
-- 2. 判斷當前日期是否在上限內
SELECT CASE WHEN CURRENT_DATE < (上述上限) THEN 1 ELSE 0 END AS contains FROM DUAL;
-- 3. 精確計算兩時間點差異(回傳 INTERVAL DAY TO SECOND)
SELECT (end_ts - start_ts) DAY TO SECOND FROM event_log;
-- 4. 為日期加減 INTERVAL
SELECT SYSDATE + INTERVAL '2-6' YEAR TO MONTH FROM DUAL; -- 2 年 6 月後
SELECT SYSTIMESTAMP + INTERVAL '3 12:30' DAY TO SECOND FROM DUAL;
-- 5. 截取 Timestamp 到秒/分/時
SELECT CAST(SYSTIMESTAMP AS DATE) FROM DUAL; -- 去除分秒小數與時區
INTERVAL 運算在 PL/SQL、SQL 皆可用,但部分舊版驅動程式(JDBC 10.2 以前、ODP.NET 舊版)不支援直接綁定,需轉為字串或 NUMBER 處理。DBMS_STATS 可正確處理 INTERVAL 欄位的高/低值。