SQL Server DATEDIFF() 日期相減

在 SQL Server 中,我們可以用 DATEDIFF() 函數取得兩個日期之間相差的時間間隔。

DATEDIFF() 語法 (Syntax)

DATEDIFF(datepart, startdate, enddate)

DATEDIFF() 執行後會返回一個正負樹的整數,表示 enddate - startdate 的時間間隔,datepart 參數則用來指定返回值的單位。

datepart 可以是:

datepart (全名和縮寫)說明
year, yyyy, yy
month, mm, m
day, dd, d
hour, hh
minute, n
second, ss, s
millisecond, ms毫秒
microsecond, mcs微秒
nanosecond, ns毫微秒
quarter, qq, q
dayofyear, dy, y一年中的第幾天
week, wk, ww

DATEDIFF() 用法 (Example)

取得兩個日期之間差幾天:

SELECT DATEDIFF(day, '2008-06-10', '2008-08-10') AS DiffDate

結果:

DiffDate
61

如果將日期前後相反過來,會得到負數:

SELECT DATEDIFF(day, '2008-08-10', '2008-06-10') AS DiffDate

結果:

DiffDate
-61

取得兩個日期之間差幾秒:

SELECT DATEDIFF(second, '2005-07-20', '2005-7-25 22:56:32') AS DiffDate
DiffDate
514592

取得一年中的第一天:

SELECT DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0)

這個 SQL 的技巧是先取得和 1900-01-01 - 也就是上面的 0 的意思,SQL Server 中的第零天 - 差幾年 (從 DATEDIFF 得到一個整數),再用 DATEADD 加 0 來將整數再轉成日期的型態。

取得一季中的第一天:

SELECT DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()), 0)

取得一個月中的第一天:

SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)

取得一周中的第一天:

SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)

取得一個月中的最後一天:

SELECT DATEADD(millisecond, -3, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0))

-3 是因為 SQL Server datetime 的精度 (precision) 是到 3 毫秒。

更多 SQL Server 相關的日期時間函數在這邊
更多 MySQL 相關的日期時間函數在這邊