計算兩個日期時間差值是常見需求。本文彙整 DATEDIFF 多種單位用法、Oracle 對應函數、以及將總秒數拆解為「天/時/分/秒」的完整實例。
DATEDIFF(datepart, startdate, enddate)
回傳 enddate - startdate 的 datepart 單位差值(整數)。
| datepart | 縮寫 | 說明 | 範例結果 |
|---|---|---|---|
| year | yy, yyyy | 年差 | 1 |
| quarter | qq, q | 季差 | 4 |
| month | mm, m | 月差 | 12 |
| dayofyear | dy, y | 年度天數差 | 365 |
| day | dd, d | 天數差 | 3 |
| week | wk, ww | 週數差 | 52 |
| hour | hh | 小時差 | 72 |
| minute | mi, n | 分鐘差 | 4320 |
| second | ss, s | 秒數差 | 259200 |
| millisecond | ms | 毫秒差 | 259200000 |
-- 天數差
SELECT DATEDIFF(day, '2008-08-25', '2008-09-01') -- 7
-- 秒數差
SELECT DATEDIFF(second, '2009-08-25 12:15:12', '2009-09-01 07:18:20')
-- 分鐘差
SELECT DATEDIFF(minute, '2009-08-25 12:15:12', '2009-09-01 07:18:20')
-- 小時差
SELECT DATEDIFF(hour, '2009-08-25 12:15:12', '2009-09-01 07:18:20')
-- 天數差
SELECT TRUNC(SYSDATE) - TO_DATE('2009-01-04', 'YYYY-MM-DD') FROM dual
-- 月數差
SELECT MONTHS_BETWEEN(TRUNC(SYSDATE, 'MM'), TO_DATE('2009-01', 'YYYY-MM')) FROM dual
-- 年數差
SELECT TRUNC(MONTHS_BETWEEN(TRUNC(SYSDATE), TO_DATE('2009-01-01', 'YYYY-MM-DD')) / 12) FROM dual
DECLARE @dt1 DATETIME, @dt2 DATETIME
SELECT @dt1 = '2008-08-04 09:36:41', @dt2 = '2008-08-02 09:33:39'
DECLARE @seconds INT, @days INT, @hours INT, @minutes INT
SELECT @seconds = DATEDIFF(second, @dt2, @dt1)
SELECT @days = @seconds / (24*60*60)
SELECT @seconds = @seconds - @days * 24*60*60
SELECT @hours = @seconds / (60*60)
SELECT @seconds = @seconds - @hours * 60*60
SELECT @minutes = @seconds / 60
SELECT @seconds = @seconds - @minutes * 60
SELECT CAST(@days AS VARCHAR(10)) + '天' +
CAST(@hours AS VARCHAR(10)) + '時' +
CAST(@minutes AS VARCHAR(10)) + '分' +
CAST(@seconds AS VARCHAR(10)) + '秒'
-- 結果範例:2天1時3分2秒
表欄位:開始天數(INT), 開始時間(VARCHAR), 到達天數(INT), 到達時間(VARCHAR)
DECLARE @t TABLE (
beginday INT, begintime VARCHAR(20),
endday INT, endtime VARCHAR(20)
)
INSERT @t SELECT 1, '16:00', 2, '12:20'
UNION ALL SELECT 1, '03:00', 3, '19:10'
-- 核心邏輯:用 DATEADD 組合 datetime 再 DATEDIFF
SELECT
RTRIM(diff_min/60) + ':' + RTRIM(diff_min%60) AS 豐費時間
FROM (
SELECT DATEDIFF(minute,
DATEADD(day, endday-beginday, beginday) - begintime + endtime
) AS diff_min
FROM @t
) t
-- 結果:20:20, 64:10
SELECT 到達天數 * 24 + DATEPART(hour, 到達時間)
- 開始天數 * 24 - DATEPART(hour, 開始時間)
FROM @t