舊類型的侷限
DATETIME:8 位元組,1753-9999 年,精度 3.33 ms,日期時間混存。
SMALLDATETIME:4 位元組,1900-2079 年,精度 1 分鐘。
- 無法單獨儲存「日期」或「時間」,精度不足、範圍受限,遷移異構資料困難。
SQL Server 2008 四大新類型
| 類型 | 儲存大小 | 日期範圍 | 時間精度 | 適用場景 |
| DATE | 3 bytes | 0001-01-01 ~ 9999-12-31 | 無 | 生日、效期、單純日期 |
| TIME(n) | 3-5 bytes | 無 | 100 ns (n=7) | 每日排程、耗時統計 |
| DATETIME2(n) | 6-8 bytes | 0001-01-01 ~ 9999-12-31 | 100 ns (n=7) | 高精度時間戳記、歷史資料 |
| DATETIMEOFFSET(n) | 8-10 bytes | 0001-01-01 ~ 9999-12-31 | 100 ns (n=7) | 跨時區應用、全球化系統 |
DATETIME2 精度與儲存關係

DATETIME2(3) 相當舊 DATETIME 但精度 1 ms、省 1 byte。
DATETIME2(7) 達 100 ns,但不保證唯一性(同一表仍可有相同時間值)。
實作範例
-- 變數宣告與賦值
DECLARE @Dt DATE, @Tm TIME(7), @Dt2 DATETIME2(3), @Dto DATETIMEOFFSET(7);
SET @Dt = GETDATE(); -- 2024-01-15
SET @Tm = GETDATE(); -- 14:30:45.1234567
SET @Dt2 = GETDATE(); -- 2024-01-15 14:30:45.123
SET @Dto = SYSDATETIMEOFFSET(); -- 2024-01-15 14:30:45.1234567 +08:00
-- 建表預設值
CREATE TABLE Events
(
EventID int PRIMARY KEY,
EventDate DATE DEFAULT CAST(GETDATE() AS DATE),
EventTime TIME(0) DEFAULT CAST(GETDATE() AS TIME(0)),
CreatedAt DATETIME2(3) DEFAULT SYSDATETIME(),
LogTime DATETIMEOFFSET(7) DEFAULT SYSDATETIMEOFFSET()
);
遷移建議
- 新開發專案優先使用新類型,精度與範圍更符合現代需求。
- 舊系統遷移時,
DATETIME → DATETIME2(3) 無損;SMALLDATETIME → DATETIME2(0) 或 DATE+TIME(0)。
- 跨時區系統務必採用
DATETIMEOFFSET,避免應用層時區轉換錯誤。