SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
典型場景:.NET 程式將 DateTime.MinValue (0001-01-01 00:00:00) 寫入 SQL Server datetime 欄位,導致溢出。
| 平台 | 類型 | 最小值 | 最大值 |
|---|---|---|---|
| .NET Framework | System.DateTime | 0001-01-01 00:00:00 | 9999-12-31 23:59:59.9999999 |
| SQL Server | datetime | 1753-01-01 00:00:00 | 9999-12-31 23:59:59.997 |
| SQL Server | datetime2 (建議) | 0001-01-01 00:00:00 | 9999-12-31 23:59:59.9999999 |
datetime 起始於 1753 年 (英國採用格里曆),早於此日期的值無法儲存。
// 錯誤:無法隱式轉換 // DateTime dt = System.Data.SqlTypes.SqlDateTime.MinValue; // 正確:強制轉換 DateTime dt = Convert.ToDateTime(System.Data.SqlTypes.SqlDateTime.MinValue); // 1753-01-01 00:00:00 // 或 DateTime dt = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
SqlDateTime.MinValue 對應 1753-01-01,符合 SQL datetime 範圍。
ALTER TABLE MyTable ALTER COLUMN CreatedAt DATETIME2(3) NOT NULL DEFAULT SYSUTCDATETIME();
DateTime 完全一致,消除溢出風險。public static DateTime SafeSqlDateTime(DateTime? input) {
if (!input.HasValue) return DateTime.UtcNow; // 或拋出業務異常
var min = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
return input.Value < min ? min : input.Value;
}
INSERT NULL → 自動填入 1900-01-01 00:00:00 (非 MinValue)。DEFAULT CONSTRAINT 未指定時同此行為。datetime2(n),n 依業務精度決定 (通常 0~3)。datetime2,確認模型映射無誤。