1. 程式人生 > >資料型別轉化之從 datetime2 資料型別到 datetime 資料型別的轉換

資料型別轉化之從 datetime2 資料型別到 datetime 資料型別的轉換

從 datetime2 資料型別到 datetime 資料型別的轉換產生一個超出範圍的值

最近在ASP.NET MVC中遇到一個問題,如題,在使用EF資料模型的時候,要去新增一條新的資料到Sqlserver資料庫,在之前專案中並沒有出現該異常,所以去扒了扒demo,發現有幾個欄位(資料庫型別為datetime)savechange的時候預設綁定了datetime.now。問題就在這裡,我的新專案並沒有給定這幾個欄位的資料。下面總結下:

觸發該錯誤的條件如下:

  1. SQL Server資料庫版本中的欄位型別為datetime2
  2. 資料庫中,某個要進行Add或者Edit的欄位的資料型別為datetime,比如表A中的today欄位,型別為datetime。而後臺程式碼進行資料庫操作時,並沒有給today(datetime型別)賦值。結果就是VS2015編譯的時候預設將其型別編譯為datetime2,導致用EF進行add和edit操作的時候出現該異常。 

解決方案:

  1. 給這些欄位一個值(不管它是否在資料庫設定了預設值),並且日期要大於1753年1月1日,這是最簡單的方法。
  2. 將資料庫型別修改為datetime?型別,也就是說允許為空。
  3. 修改資料庫欄位型別為datetime2型別,前提是資料庫要支援該型別。
  4. 在C#中用new DateTime(year,month,day,hour,minute,second)來限制精度,原因之後會在datetime2和datetime的區別中提到。
  5. 這個方法不太推薦,將model的edmx中的providerManifestToken設定成2005,這樣ef就預設轉化成datetime。

datetime2和datetime的區別:

官方MSDN對於datetime2的說明:定義結合了 24 小時制時間的日期。 可將 datetime2 視作現有 datetime 型別的擴充套件,其資料範圍更大,預設的小數精度更高,並具有可選的使用者定義的精度。

這裡值的注意的是datetime2的日期範圍是"0001-01-01 到 9999-12-31"(公元元年 1 月 1 日到公元 9999 年 12 月 31 日)。

而datetime的日期範圍是:”1753 年 1 月 1 日到 9999 年 12 月 31 日“。這裡的日期範圍就是造成“從 datetime2 資料型別到 datetime 資料型別的轉換產生一個超出範圍的值”這個錯誤的原因。

1

2

3

4

5

DateTime欄位型別對應的時間格式是yyyy-MM-dd HH:mm:ss.fff,3個f,精確到1毫秒(ms),示例2014-12-0317:06:15.433。

 

DateTime2欄位型別對應的時間格式是yyyy-MM-dd HH:mm:ss.fffffff,7個f,精確到0.1微秒(μs),示例2014-12-0317:23:19.2880929。

 

如果用SQL的日期函式進行賦值,DateTime欄位型別要用GETDATE(),DateTime2欄位型別要用SYSDATETIME()。