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 毫秒。