SQL Server 2008 引入四種新日期時間型別,徹底解決舊版 DATETIME/SMALLDATETIME「日期與時間綁定、精度不足、時區無感知」三大痛點。
| 型別 | 儲存大小 | 範圍 | 精度 | 適用場景 |
|---|---|---|---|---|
| DATE | 3 bytes | 0001-01-01 ~ 9999-12-31 | 天 | 純日期(生日、效期、會計期間) |
| TIME | 3~5 bytes | 00:00:00.0000000 ~ 23:59:59.9999999 | 100 奈秒 | 純時間(班次、營業時段、計時器) |
| DATETIME2 | 6~8 bytes | 同 DATE + TIME | 100 奈秒 | 高精度時間戳記(取代 DATETIME) |
| DATETIMEOFFSET | 8~10 bytes | 同 DATETIME2 + 時區位移 | 100 奈秒 | 跨時區應用、全球化系統 |
DATE、TIME 獨立存儲,查詢不再需 DATEDIFF(day, ...) 繞道,索引可直接求值。DATETIME2 精度達 100ns,較 DATETIME 3.33ms 提升 33,000 倍,滿足高頻交易、IoT 時間序列需求。DATETIMEOFFSET 內建位移(+hh:mm),消除應用層時區轉換 Bug,支援 SWITCHOFFSET、TODATETIMEOFFSET 函數。-- 取得當前日期(無時間)
DECLARE @d DATE = SYSDATETIME(); -- 或 CAST(SYSDATETIME() AS DATE)
SELECT @d; -- 2024-05-18
-- 取得當前時間(無日期)
DECLARE @t TIME = SYSDATETIME();
SELECT @t; -- 14:35:12.1234567
-- 高精度日期時間
DECLARE @dt2 DATETIME2 = SYSDATETIME();
SELECT @dt2; -- 2024-05-18 14:35:12.1234567
-- 帶時區
DECLARE @dto DATETIMEOFFSET = SYSDATETIMEOFFSET();
SELECT @dto; -- 2024-05-18 14:35:12.1234567 +08:00
-- 時區轉換
SELECT SWITCHOFFSET(@dto, '-05:00'); -- 轉換為美東時間
SELECT TODATETIMEOFFSET(@dt2, '+08:00');-- 附加時區位移
DATETIME 僅維護相容舊模組。DATETIME 欄位若無時區需求,可直接 ALTER COLUMN ... DATETIME2(資料無損、精度提升)。DateTime/DateTimeOffset 物件,避免字串格式化轉換。DATETIME2 而非 DATETIME,減少頁分裂與統計資料誤差。SQL Server 2008 的日期時間型別現代化,為開發者提供精確、語意清晰、標準相容的工具箱。善用它們,能從根本消除一大類時間處理 Bug,並提升查詢效能與跨時區正確性。