用於表示「年」與「月」的時間間隔,精確度僅至月份。
INTERVAL 'integer [- integer]' {YEAR | MONTH} [(precision)] [TO {YEAR | MONTH}]
precision:年或月的位數精度,範圍 0~9,預設 2。'years-months',如 '123-2' 表 123 年 2 月。| 語法 | 含義 | 備註 |
|---|---|---|
INTERVAL '123-2' YEAR(3) TO MONTH | 123 年 2 月 | YEAR(3) 允許 3 位數年份 |
INTERVAL '123' YEAR(3) | 123 年 0 月 | 省略月份預設為 0 |
INTERVAL '300' MONTH(3) | 300 月 | MONTH 精度 3 位數 |
INTERVAL '4' YEAR | 4 年 | 等同 '4-0' YEAR TO MONTH |
INTERVAL '50' MONTH | 50 月 | 等同 '4-2' YEAR TO MONTH |
INTERVAL '123' YEAR | 錯誤 | 預設精度 2 不足以容納 123,需寫 YEAR(3) |
-- 間隔相加
INTERVAL '5-3' YEAR TO MONTH + INTERVAL '20' MONTH = INTERVAL '6-11' YEAR TO MONTH
-- NUMTOYMINTERVAL(n, 'unit'):數值轉年月間隔
SELECT NUMTOYMINTERVAL(100, 'YEAR') FROM DUAL; -- +100-00
SELECT NUMTOYMINTERVAL(100, 'MONTH') FROM DUAL; -- +08-04 (8 年 4 月)
表示精確至秒 (含小數秒) 的時間間隔。
INTERVAL '{ integer | integer time_expr | time_expr }'
{ DAY | HOUR | MINUTE } [ (leading_precision) ]
| SECOND [ (leading_precision [, fractional_seconds_precision]) ]
[ TO { DAY | HOUR | MINUTE | SECOND [ (fractional_seconds_precision) ] } ]
leading_precision:前導欄位位數,0~9,預設 2。fractional_seconds_precision:秒小數位數,0~9,預設 6。time_expr 格式:HH[:MI[:SS[.n]]] 或 MI[:SS[.n]] 或 SS[.n]。| 語法 | 含義 |
|---|---|
INTERVAL '4 5:12:10.222' DAY TO SECOND(3) | 4 天 5 時 12 分 10.222 秒 |
INTERVAL '400 5' DAY(3) TO HOUR | 400 天 5 時 (DAY 需 3 位數精度) |
INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) | 11 時 12 分 10.2222222 秒 |
INTERVAL '30.12345' SECOND(2,4) | 30.1235 秒 (四捨五入至 4 位小數) |
INTERVAL '20' DAY - INTERVAL '240' HOUR | 10 天 0 秒 |
SELECT NUMTODSINTERVAL(100, 'DAY') FROM DUAL; -- +100 00:00:00
SELECT NUMTODSINTERVAL(100, 'HOUR') FROM DUAL; -- +04 04:00:00
SELECT NUMTODSINTERVAL(100, 'MINUTE') FROM DUAL; -- +00 01:40:00
SELECT NUMTODSINTERVAL(100, 'SECOND') FROM DUAL; -- +00 00:01:40
-- NUMTODSINTERVAL 不支援 YEAR/MONTH 單位,會報 ORA-01760
兩個 DATE 相減結果為「天數」(可為負數):
SELECT TO_DATE('1999-12-12','YYYY-MM-DD') - TO_DATE('1999-12-01','YYYY-MM-DD') FROM DUAL; -- 11
SELECT TO_DATE('2999-10-12','YYYY-MM-DD') - TO_DATE('1999-12-01','YYYY-MM-DD') FROM DUAL; -- 365193
CREATE TABLE bb (
a DATE,
b DATE,
c INTERVAL YEAR(9) TO MONTH
);
INSERT INTO bb VALUES (TO_DATE('1985-12-12','YYYY-MM-DD'), TO_DATE('1984-12-01','YYYY-MM-DD'), NULL);
-- 將日期差天數轉為年月間隔存入 c
UPDATE bb SET c = NUMTOYMINTERVAL(a - b, 'YEAR');
-- 結果:+376-00 (376 年 0 月)
範例:INTERVAL '5-10' YEAR TO MONTH → DUMP: Typ=182 Len=5: 80,0,0,5,46
年:0x80000005 - 0x80000000 = 5
月:0x46 - 60 = 10
範例:INTERVAL '5 0:0:10' DAY TO SECOND → DUMP: Typ=183 Len=11: 80,0,0,5,3c,3c,46,80,0,0,0