在 Oracle 中,兩個 DATE 型別欄位相減,結果為 天數差值(包含小數部分)。這是所有時間單位轉換的基礎。例如:
END_DATE - START_DATE -- 結果單位:天(含小數,代表一天的分數)
基於「1 天 = 24 小時 = 1440 分鐘 = 86400 秒 = 86,400,000 毫秒」的換算關係:
| 目標單位 | 計算公式 | 說明 |
|---|---|---|
| 天 | ROUND(END_DATE - START_DATE) | 直接取整數天數 |
| 小時 | ROUND((END_DATE - START_DATE) * 24) | 天數 × 24 |
| 分鐘 | ROUND((END_DATE - START_DATE) * 24 * 60) | 天數 × 1440 |
| 秒 | ROUND((END_DATE - START_DATE) * 24 * 60 * 60) | 天數 × 86400 |
| 毫秒 | ROUND((END_DATE - START_DATE) * 24 * 60 * 60 * 1000) | 天數 × 86,400,000 |
Oracle 9i 以上版本支援 INTERVAL DAY TO SECOND 型別,提供更精確且語意清晰的計算方式:
-- 直接獲得 INTERVAL 型別差值
SELECT (END_DATE - START_DATE) DAY TO SECOND AS time_diff
FROM your_table;
-- 提取具體單位
SELECT
EXTRACT(DAY FROM (END_DATE - START_DATE) DAY TO SECOND) AS days,
EXTRACT(HOUR FROM (END_DATE - START_DATE) DAY TO SECOND) AS hours,
EXTRACT(MINUTE FROM (END_DATE - START_DATE) DAY TO SECOND) AS minutes,
EXTRACT(SECOND FROM (END_DATE - START_DATE) DAY TO SECOND) AS seconds
FROM your_table;
WITH sample_data AS (
SELECT
TO_DATE('2024-01-15 08:30:00', 'YYYY-MM-DD HH24:MI:SS') AS start_dt,
TO_DATE('2024-01-18 14:45:30', 'YYYY-MM-DD HH24:MI:SS') AS end_dt
FROM dual
)
SELECT
ROUND(end_dt - start_dt) AS diff_days,
ROUND((end_dt - start_dt) * 24) AS diff_hours,
ROUND((end_dt - start_dt) * 24 * 60) AS diff_minutes,
ROUND((end_dt - start_dt) * 24 * 60 * 60) AS diff_seconds,
ROUND((end_dt - start_dt) * 24 * 60 * 60 * 1000) AS diff_milliseconds
FROM sample_data;
ROUND 四捨五入,TRUNC 直接捨去小數;視業務需求選擇TIMESTAMP,相減結果為 INTERVAL DAY TO SECOND,需用 EXTRACT 或轉換函數處理掌握 Oracle 日期時間差計算的核心在於理解「日期相減得天數」這一基本原則,再配合簡單的數學換算即可獲得任意時間單位。現代版本更推薦使用 INTERVAL 型別進行語意更清晰、精度更高的處理。