DATEDIFF ( datepart , startdate , enddate )
回傳 enddate - startdate 的 datepart 邊界跨越數 (有號整數)。
| datepart | 縮寫 | 說明 |
|---|---|---|
| year | yy, yyyy | 年界跨越數 |
| quarter | qq, q | 季界跨越數 |
| month | mm, m | 月界跨越數 |
| dayofyear / day | dy, y / dd, d | 天界跨越數 |
| week | wk, ww | 週界跨越數 (週日為週首) |
| hour | hh | 時界跨越數 |
| minute | mi, n | 分界跨越數 |
| second | ss, s | 秒界跨越數 |
| millisecond | ms | 毫秒界跨越數 |
| microsecond | mcs | 微秒界跨越數 |
| nanosecond | ns | 奈秒界跨越數 |
-- 1. 兩日期相差天數
SELECT DATEDIFF(DAY, '2012-01-03', CONVERT(VARCHAR(8), GETDATE(), 112));
-- 2. 年齡計算 (年界跨越)
SELECT DATEDIFF(YEAR, BirthDate, GETDATE()) -
CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, BirthDate, GETDATE()), BirthDate) > GETDATE() THEN 1 ELSE 0 END AS Age;
-- 3. 會員存活天數
SELECT DATEDIFF(DAY, CreateDate, GETDATE()) AS SurvivalDays FROM Members;
-- 4. 逾期分鐘數
SELECT DATEDIFF(MINUTE, DueDate, GETDATE()) AS OverdueMinutes FROM Orders;
DATEDIFF(DAY, '2023-12-31 23:59', '2024-01-01 00:01') = 1 (跨越午夜),實際僅 2 分鐘。DATEDIFF(SECOND, ...) 或 DATEDIFF(MINUTE, ...) 再換算。startdate > enddate 回傳負數。DECLARE @diff BIGINT = DATEDIFF(SECOND, @start, @end);
SELECT
@diff / 86400 AS Days,
(@diff % 86400) / 3600 AS Hours,
(@diff % 3600) / 60 AS Minutes,
@diff % 60 AS Seconds;