核心日期時間函數速查表
| 函數 | 用途 | 回傳型別 | 範例 |
GETDATE() | 取得目前系統日期時間 (精確到毫秒) | DATETIME | SELECT GETDATE(); -- 2024-05-20 14:30:45.123 |
DATENAME(datepart, date) | 取得日期指定部分的字串名稱 (如月份名稱、星期名稱) | NVARCHAR | SELECT DATENAME(month, GETDATE()); -- 五月 |
DATEPART(datepart, date) | 取得日期指定部分的整數值 (適合運算/比較) | INT | SELECT DATEPART(weekday, GETDATE()); -- 2 (週一) |
DATEADD(datepart, number, date) | 日期加減運算 | 同輸入日期型別 | SELECT DATEADD(day, -7, GETDATE()); -- 一週前 |
DATEDIFF(datepart, start, end) | 兩日期差值計算 | INT | SELECT DATEDIFF(day, '2024-01-01', GETDATE()); |
CONVERT(data_type, expression, style) | 日期格式化輸出 (style 代碼控制格式) | 指定型別 | SELECT CONVERT(VARCHAR(10), GETDATE(), 111); -- 2024/05/20 |
DATENAME / DATEPART 參數完整對照表
| 日期部分 | 縮寫 | 說明 |
| year | yy, yyyy | 年份 (如 2024) |
| quarter | qq, q | 季度 (1-4) |
| month | mm, m | 月份 (1-12 或 名稱) |
| dayofyear | dy, y | 年間第幾天 (1-366) |
| day | dd, d | 月份第幾天 (1-31) |
| week | wk, ww | 年間第幾週 (1-53) |
| weekday | dw | 星期幾 (1=週日 ... 7=週六,受 SET DATEFIRST 影響) |
| hour | hh | 小時 (0-23) |
| minute | mi, n | 分鐘 (0-59) |
| second | ss, s | 秒 (0-59) |
| millisecond | ms | 毫秒 (0-999) |
實戰範例集
1. 自訂 now() 函數 (SQL Server 2005+ 支援 UDF 呼叫 GETDATE)
CREATE FUNCTION dbo.fn_Now()
RETURNS DATETIME
AS BEGIN
RETURN GETDATE();
END;
GO
-- 使用
SELECT dbo.fn_Now() AS CurrentDateTime;
GO
-- 移除
DROP FUNCTION dbo.fn_Now;
2. 取得「今年」、「本月」、「本週一」起始日期
-- 年初
SELECT DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0);
-- 月初
SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0);
-- 本週一 (假設週一為週首)
SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0);
3. 格式化輸出常用 Style 代碼
| Style | 輸出格式 | 範例 |
| 112 | YYYYMMDD | 20240520 |
| 111 | YYYY/MM/DD | 2024/05/20 |
| 120 | YYYY-MM-DD HH:MI:SS (24h) | 2024-05-20 14:30:45 |
| 108 | HH:MI:SS | 14:30:45 |
| 113 | DD MON YYYY HH:MI:SS:MMM (歐洲預設) | 20 May 2024 14:30:45:123 |
4. 計算年齡 / 年齡區間分組
-- 精確年齡
SELECT DATEDIFF(year, BirthDate, GETDATE()) -
CASE WHEN DATEADD(year, DATEDIFF(year, BirthDate, GETDATE()), BirthDate) > GETDATE() THEN 1 ELSE 0 END AS Age;
-- 年齡層分組 (十歲一組)
SELECT (DATEDIFF(year, BirthDate, GETDATE()) / 10) * 10 AS AgeGroup, COUNT(*)
FROM Users GROUP BY (DATEDIFF(year, BirthDate, GETDATE()) / 10) * 10;
SQL Server vs MySQL 日期型別差異
| 型別 | SQL Server | MySQL |
| 日期 | DATE (2008+) | DATE |
| 日期時間 | DATETIME / DATETIME2(7) / SMALLDATETIME | DATETIME / TIMESTAMP |
| 時間 | TIME (2008+) | TIME |
| 時間戳 | TIMESTAMP (Rowversion, 二進位) | TIMESTAMP (自動更新日期時間) |
注意:SQL Server 的 TIMESTAMP 是 ROWVERSION 同義詞,不儲存日期時間,僅用於版本控制/樂觀鎖。MySQL 的 TIMESTAMP 則是時區感知的日期時間。
效能提示
- 避免在 WHERE 條件對欄位使用函數 (如
WHERE DATENAME(month, CreateDate) = '五月'),會導致索引失效。改用範圍查詢:WHERE CreateDate >= '2024-05-01' AND CreateDate < '2024-06-01'。
GETDATE() 為非確定性函數,用於計算欄位/檢查條件約束時需謹慎。
- 大量資料日期轉換時,
CONVERT 配合 style 代碼比字串拼接快得多。