SQL Server 2005+ 中,datetime 類型字段插入空字符串 '' 時,不會報錯而是默認存儲為 1900-01-01 00:00:00.000。
'' 隱式轉換為 datetime 時,SQL Server 將其解析為基準日期(0 個 tick 對應 1900-01-01)NULL 語義完全不同,但應用層常誤用 '' 表示「無日期」-- 核心技巧:NULLIF 將 '' 轉為 NULL,再 CAST
SELECT
CAST('' AS datetime) AS raw_insert, -- 1900-01-01
CAST(NULLIF('', '') AS datetime) AS nullif_fix, -- NULL
ISNULL(CAST(NULLIF('', '') AS datetime), GETDATE()) AS with_default; -- 當前時間
結果對比:
raw_insert nullif_fix with_default
------------------- ------------ -------------------
1900-01-01 00:00:00 NULL 2024-01-15 14:30:00
-- 存儲過程示例
CREATE PROC InsertData @dt VARCHAR(50) AS
BEGIN
DECLARE @real_dt DATETIME = CASE
WHEN @dt = '' OR @dt IS NULL THEN NULL
ELSE CAST(@dt AS DATETIME)
END;
INSERT INTO t(col) VALUES (@real_dt);
END
ALTER TABLE t ADD CONSTRAINT DF_t_col DEFAULT NULL FOR col;
-- 或
ALTER TABLE t ALTER COLUMN col DATETIME NULL; -- 確保允許NULL
NULL 而非 ''CAST(NULLIF(col, '') AS datetime) 統一輸出1900-01-01 批量更新為 NULLNULL=未知/不適用,1900-01-01=業務真實日期(極少見)