Oracle 9i 以前無內建間隔型別,只能用 DATE 記錄時間點,間隔需轉換為秒數存入 NUMBER 欄位。但 60 秒=1 分、60 分=1 時、24 時=1 天,在十進位系統中換算極不直觀,計算錯誤率高。
| 型別 | 適用場景 | 精度預設值 |
|---|---|---|
| INTERVAL YEAR TO MONTH | 年月間隔 | 年份 2 位數 |
| INTERVAL DAY TO SECOND | 天、時、分、秒、毫秒間隔 | 天 2 位數、秒小數 6 位數 |
搭配 TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE,可精確至亞秒並處理時區。
INTERVAL YEAR[(year_precision)] TO MONTH
INTERVAL DAY[(day_precision)] TO SECOND[(fractional_seconds_precision)]
INTERVAL '2-6' YEAR TO MONTH(2 年 6 月)INTERVAL '3 12:30:06.7' DAY TO SECOND(1)(3 天 12 時 30 分 6.7 秒)間隔可正可負,可與 TIMESTAMP 型別加減運算,間隔之間亦可加減。
CREATE TABLE experiment (
experiment_id NUMBER(9),
experiment_desc VARCHAR2(80),
experiment_start TIMESTAMP,
experiment_duration INTERVAL DAY(1) TO SECOND(4)
);
INSERT INTO experiment VALUES (
1, 'Busted urban myth',
TIMESTAMP '2006-06-01 14:00:00',
INTERVAL '1 02:31:15.1250' DAY(1) TO SECOND(4)
);
-- 計算結束時間
SELECT experiment_id, experiment_start,
experiment_start + experiment_duration AS experiment_end
FROM experiment;
-- 結果:2006-06-02 16:31:15.125000000
TO_CHAR 無直接支援間隔型別格式模型,需用 EXTRACT 逐欄位取值組合:
SELECT EXTRACT(DAY FROM experiment_duration) || ' days, ' ||
EXTRACT(HOUR FROM experiment_duration) || ' hours, ' ||
EXTRACT(MINUTE FROM experiment_duration) || ' minutes' AS Duration
FROM experiment;
-- 結果:1 days, 2 hours, 31 minutes
start + duration = end、end - start = duration。SUM(duration)、AVG(duration) 直接運算,無需手動換算。TIMESTAMP WITH TIME ZONE 跨時區計算自動正確。善用 INTERVAL 型別能讓時間間隔邏輯更清晰、程式碼更易維護、計算更準確,是 Oracle 9i 以降時間相關應用開發的最佳實踐。