#背景
向sqlserver數據庫中一個datetime字段插入DateTime.MinValue時,
出現問題:
SqlDateTime 溢出。必須介於 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之間
#錯誤原因
當傳給數據庫的時間類型的值為NULL,或者為DateTime.MinValue時,插入或者更新數據庫時,datetime字段值會默認插入0001年01月01日造成datetime類型溢出。
這里的NULL指的是程序代碼里面的null,大多數出現這種情況的情景是:在程序里面定義了一個時間類型的變量,沒有給賦值,就傳給數據庫了。這時這個變量的值默認是賦成了01年01月01日。
由於數據庫中DateTime類型字段,最小值是1/1/1753 12:00:00,而.NET Framework中,DateTime類型,最小值是1/1/0001 0:00:00,顯然,超出了sql的值的最小值范圍,導致數據溢出錯誤。
通過C#看.net和sql的最大小時間:
1 DateTime t=new DateTime(); 2 DateTime t1 = DateTime.MinValue; 3 DateTime t2 = DateTime.MaxValue; 4 DateTime t3 = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; 5 DateTime t4 = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue; 6 Console.WriteLine(".net中DateTime默認值{0}", t); 7 Console.WriteLine(".net最小時間為{0}", t1); 8 Console.WriteLine(".net最大時間為{0}", t2); 9 Console.WriteLine("SQL最小時間為{0}", t3); 10 Console.WriteLine("SQL最大時間為{0}", t4);
輸出效果:
#解決方法
1、確保Datetime類型變量賦值后,再向數據庫更新數據;
2、如果數據庫中數據類型為Datetime,如果想插入最小值,那在程序中使用System.Data.SqlTypes.SqlDateTime.MinValue替代System.DateTime.MinValue,這樣SqlDateTime的MinValue和Sql中DateTime的范圍吻合,就不會再出現以上的錯誤了。也可以將數據庫中的Datetime類型修改為Datetime2類型,這樣使用System.DateTime.MinValue就不會出現超出范圍的情況了;
3、通常情況下,我們不在日期字段里存入空值.當沒有日期值時存入'1900-1-1',這個叫做默認時間值。在讀取數據的時候,遇到1900-1-1就認為數據庫該時間字段沒有值;
insert into 表名 (Datetime字段名) values (cast(nullif('程序中傳入的時間類型變量','')) as DateTime)