取得當前日期時間
SELECT GETDATE(); -- 回傳 DATETIME,精度 3.33 毫秒
-- 結果範例: 2024-01-15 14:30:45.123
作為欄位預設值:自動記錄建立/修改時間
CREATE TABLE SiteLog (
UserName NVARCHAR(50),
Activity NVARCHAR(200),
EntryDate DATETIME DEFAULT GETDATE() -- 插入時自動填入當前時間
);
CONVERT 格式化輸出:標準格式代碼對照表
| 代碼 | 標準/風格 | 輸出範例 |
| 0 | 預設 (mon dd yyyy hh:miAM) | Jan 15 2024 2:30PM |
| 1 | 美國 (mm/dd/yy) | 01/15/24 |
| 2 | ANSI (yy.mm.dd) | 24.01.15 |
| 3 | 英/法 (dd/mm/yy) | 15/01/24 |
| 4 | 德國 (dd.mm.yy) | 15.01.24 |
| 5 | 義大利 (dd-mm-yy) | 15-01-24 |
| 6 | - (dd mon yy) | 15 Jan 24 |
| 7 | - (mon dd, yy) | Jan 15, 24 |
| 8 | - (hh:mi:ss) | 14:30:45 |
| 9 | 預設 + 毫秒 (mon dd yyyy hh:mi:ss:mmmAM) | Jan 15 2024 2:30:45:123PM |
| 10 | 美國 (mm-dd-yy) | 01-15-24 |
| 11 | 日本 (yy/mm/dd) | 24/01/15 |
| 12 | ISO (yymmdd) | 240115 |
| 13 | 歐洲預設 + 毫秒 (dd mon yyyy hh:mi:ss:mmm 24h) | 15 Jan 2024 14:30:45:123 |
| 14 | - (hh:mi:ss:mmm 24h) | 14:30:45:123 |
| 20 | ODBC 標準 (yyyy-mm-dd hh:mi:ss) | 2024-01-15 14:30:45 |
| 21 | ODBC 毫秒 (yyyy-mm-dd hh:mi:ss.mmm) | 2024-01-15 14:30:45.123 |
| 126 | ISO 8601 (yyyy-mm-ddThh:mi:ss.mmm) | 2024-01-15T14:30:45.123 |
| 127 | ISO 8601 帶時區 | 2024-01-15T14:30:45.123Z |
常用格式化範例
-- 含毫秒 (代碼 9/21/121)
SELECT CONVERT(VARCHAR(30), GETDATE(), 9); -- Jan 15 2024 2:30:45:123PM
SELECT CONVERT(VARCHAR(30), GETDATE(), 21); -- 2024-01-15 14:30:45.123
SELECT CONVERT(VARCHAR(30), GETDATE(), 121); -- 2024-01-15T14:30:45.123
-- 純日期
SELECT CONVERT(VARCHAR(10), GETDATE(), 112); -- 20240115 (適合排序、分區)
SELECT CONVERT(VARCHAR(10), GETDATE(), 23); -- 2024-01-15
-- 純時間
SELECT CONVERT(VARCHAR(12), GETDATE(), 14); -- 14:30:45:123
SELECT CONVERT(VARCHAR(8), GETDATE(), 108); -- 14:30:45
日期時間運算函數
| 函數 | 用途 | 範例 |
| DATEADD | 加減間隔 | DATEADD(DAY, -7, GETDATE()) 一週前 |
| DATEDIFF | 計算差距 | DATEDIFF(SECOND, StartTime, EndTime) 執行秒數 |
| DATEPART | 取單一部分 | DATEPART(HOUR, GETDATE()) 當前小時 |
| DATENAME | 取名稱 | DATENAME(MONTH, GETDATE()) 'January' |
| DAY/MONTH/YEAR | 快捷取值 | YEAR(GETDATE()) 2024 |
新版本推薦 (SQL Server 2012+)
-- FORMAT 函數 (依 .NET 格式字串,支援文化特性)
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss.fff', 'zh-TW'); -- 2024-01-15 14:30:45.123
SELECT FORMAT(GETDATE(), 'D', 'zh-TW'); -- 2024年1月15日
-- DATETIME2 / DATETIMEOFFSET 更高精度 (100 奈秒) 與時區感知
DECLARE @dt2 DATETIME2(7) = SYSDATETIME(); -- 2024-01-15 14:30:45.1234567
DECLARE @dto DATETIMEOFFSET(7) = SYSDATETIMEOFFSET(); -- 2024-01-15 14:30:45.1234567 +08:00
實務建議
- 儲存用 DATETIME2(3~7):精度更高、範圍更大 (0001-9999 年)、儲存體更省 (6-8 bytes vs 8 bytes)。
- 跨時區系統用 DATETIMEOFFSET:保留原始時區資訊,避免換算錯誤。
- 查詢範圍條件用「半開區間」:
WHERE CreatedAt >= '2024-01-01' AND CreatedAt < '2024-02-01',利用索引、避免隱含轉換。
- 避免在 WHERE 欄位上用函數:
WHERE YEAR(CreatedAt) = 2024 → 索引失效;改用範圍條件。