在 SQL Server 中進行時間比較,最常用的函數是 DATEDIFF。它的語法為 DATEDIFF(datepart, startdate, enddate),回傳兩個日期之間指定單位的差異數值。重點在於參數順序:startdate 為被減數,enddate 為減數,即 enddate - startdate。若結果為正數,代表 enddate 較晚;負數則代表 startdate 較晚。
DATEDIFF(year, '2004-01-01', '2010-01-01') → 6DATEDIFF(month, '2010-01-15', '2010-06-20') → 5(僅比較月份部分)DATEDIFF(day, '2010-07-23 00:41:18', '2010-07-23 23:41:18') → 0(同一天)DATEDIFF(hour, '2010-07-23 00:41:18', '2010-07-23 23:41:18') → 23DATEDIFF(second, '2004-09-18 00:00:18', '2004-09-18 00:00:19') → 1GETDATE() 回傳目前系統日期時間,精確度達 3.33 毫秒。常用於資料表欄位的預設值:
CREATE TABLE site_log (
username VARCHAR(40),
useractivity VARCHAR(100),
entrydate DATETIME DEFAULT GETDATE()
);
使用 CONVERT(VARCHAR(30), GETDATE(), style) 可依 style 參數輸出不同格式。常用 style 值:
| Style | 標準 | 輸出範例 |
|---|---|---|
| 0 | Default | Mon DD YYYY HH:MIAM |
| 1 | USA | MM/DD/YY |
| 3 | British/French | DD/MM/YY |
| 8 | - | HH:MI:SS |
| 9 | Default + milliseconds | Nov 30 1997 3:29:55:170AM |
| 11 | JAPAN | YY/MM/DD |
| 12 | ISO | YYMMDD |
| 20 | ODBC canonical | YYYY-MM-DD HH:MI:SS |
| 23 | ISO8601 | YYYY-MM-DD |
| 111 | JAPAN + century | YYYY/MM/DD |
| 120 | ODBC canonical + century | YYYY-MM-DD HH:MI:SS |
若需顯示世紀(四位數年份),可將 style 值加 100(如 111 = 11 + 100)。
DATEPART(datepart, date) 回傳整數,DATENAME(datepart, date) 回傳字串。常用 datepart 縮寫:
yy、季:qq、月:mm、日:ddhh、分:mi、秒:ss、毫秒:msdw(1=星期日)、年內第幾天:dy、年內第幾週:wk範例:SELECT DATENAME(dw, GETDATE()) + '-' + DATENAME(mm, GETDATE()) → Friday-July
直接比對 WHERE entrydate = '2000-12-25' 只會抓到當天 00:00:00 的資料。正確做法:
WHERE entrydate >= '2000-12-25' AND entrydate < '2000-12-26'WHERE entrydate LIKE 'Dec 25 2000%'(需先用 CONVERT 轉為字串格式)DATEADD(datepart, number, date) 可對日期進行加減。例如查詢一個月後的到期日:
SELECT username, DATEADD(month, 1, firstvisit_date) AS 'Registration Expires'
FROM registration_table;
注意:DATEADD(month, 1, ...) 只是將月份值 +1,不會自動加 30 天。
SELECT hiredate
FROM employees
WHERE hiredate BETWEEN CAST('1993-10-17' AS DATETIME) AND CAST('1994-01-02' AS DATETIME);
-- 找出 1993-05-03 之後入職的員工
SELECT hiredate
FROM employees
WHERE DATEDIFF(day, CAST('1993-05-03' AS DATETIME), hiredate) > 0;
邏輯:DATEDIFF(day, start, hiredate) > 0 代表 hiredate 較晚於 start。