首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 日期時間差值計算:DATEDIFF 多單位與時分秒拆解實例

     編輯:MySQL 資料庫相關知識

計算兩個日期時間差值是常見需求。本文彙整 DATEDIFF 多種單位用法、Oracle 對應函數、以及將總秒數拆解為「天/時/分/秒」的完整實例。

SQL Server DATEDIFF 基本語法

DATEDIFF(datepart, startdate, enddate)

回傳 enddate - startdate 的 datepart 單位差值(整數)。

常用單位對照表

datepart縮寫說明範例結果
yearyy, yyyy年差1
quarterqq, q季差4
monthmm, m月差12
dayofyeardy, y年度天數差365
daydd, d天數差3
weekwk, ww週數差52
hourhh小時差72
minutemi, n分鐘差4320
secondss, s秒數差259200
millisecondms毫秒差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')

Oracle 對應寫法

-- 天數差
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秒

實務場景:VARCHAR 型別的「天數+時間」相減

表欄位:開始天數(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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved