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