2011-10-19 58 views
29

時,我有一個約會時,我產生這樣的:毫秒我的日期時間的變化存儲在SQL Server

DateTime myDateTime = DateTime.Now; 

我然後將其存儲在數據庫中(在一個DateTime類型的列)實體框架。然後我用OData(WCF數據服務)檢索它。

當它將出現在的TimeOfDay值是:09:30:03.0196095

當它出來的的TimeOfDay值:09:30:03.0200000

這樣做的實際效果,使它使毫秒在保存之前被視爲19,在被重新加載之後被視爲20。

因此,當我在代碼中稍後進行比較時,它會在應該相等的地方失敗。

SQL Server沒有.NET那麼精確嗎?或者它是實體框架還是OData搞砸了?

我將截斷毫秒(我真的不需要它們)。但我想知道爲什麼會發生這種情況。

+0

你是怎麼做比較的? – ChrisBint

+1

這是一個不同的精度。查看相關的問題。 –

+1

你在什麼版本的SQL Server?如果2008年'datetime2'具有更高的精度。 –

回答

37

這實際上取決於您使用的SQL服務器的版本。

日期時間字段的分辨率爲3個小數位:例如:2011-06-06 23:59:59.997,並且僅在3.33毫秒內準確。

在你的情況,09:30:03.0196095被四捨五入到09:在存儲03.020:30。

從SQL 2008開始,添加了其他數據類型以提供更多詳細信息,例如datetime2具有多達7位小數位,並且精確到100ns以內。

更多信息請參閱以下內容: http://www.karaszi.com/SQLServer/info_datetime.asp

我認爲最好的方法是提供舍入第二先前在SQL Server存儲它,如果毫秒是不重要的。

3

SQL Server中DateTime的精度爲毫秒(.fff)。所以0.0196會變成0.020。如果您可以使用datetime2,則可以獲得更高的精度。

+0

唉,DateTime2在OData中不受支持。所以我不能使用它。 – Vaccano

17

這是由於SQL datetime類型的精度所致。根據MSDN:

日期時間值四捨五入爲.000增量,.003,或0.007秒

看的this msdn page和你」的datetime分數精確到秒部分的舍入我會理解這個舍入是如何完成的。

正如其他人所指出的,你可以使用datetime2,而不是datetime有更好的精度:

  • datetime時間範圍爲00:00:00 through 23:59:59.997
  • datetime2時間範圍爲00:00:00 through 23:59:59.9999999
+0

datetime2仍然以毫秒爲單位對我進行四捨五入。爲什麼?? – RobPio

2

對於那些誰沒有能力在SQL中使用DateTime2(例如:像我一樣使用由獨立系統生成的表e改變這個單一問題),有一個簡單的代碼修改,將爲你做四捨五入。

引用System.Data並導入System.Data.SqlTypes命名空間。然後,您可以使用SqlDateTime結構做轉換爲你:

DateTime someDate = new SqlDateTime(DateTime.Now).Value; 

這將值轉換爲SQL蜱,再放回.NET蜱,包括精度損失。 :)

一句警告,這將丟失原始DateTime結構(即Utc,Local)的Kind。這種轉換也不是簡單的四捨五入,有一個完整的轉換,包括勾號計算,MaxTime變化等。所以如果你依靠DateTime中的特定指標,那麼不要使用它,因爲它們可能會丟失。