2013-08-21 59 views
2

我正在嘗試使用VB.NET EntityFramework來添加一個新的記錄,其中的字段是DateTime類型。VB.Net DateTime與SQL DateTime匹配嗎?

兩種類型的DateTime是否匹配以允許直接保存而不進行任何轉換或格式化?

IE應在下述工作(其中表是WidgetResult,我嘗試添加一個新的記錄)

Private Sub AddNewWidgetResultRecord() 
    Dim newWidgetResult As New WidgetResult() 
    newWidgetResult.SomeVarChar = "Some widget string" 
    newWidgetResult.SomeDateTime = DateTime.Now ' Would this line be OK?' 
    myContext.AddToWidgetResult(newWidgetResult) 
    myContext.SaveChanges() 
End Sub 

我也查了很多其他職位上這一點,但他們似乎都關注INSERT查詢,而不是使用EF提供的方法。

+1

是的,你試過嗎? ™ – SQLMason

回答

4

如果可能,您希望SQL Server使用datetime2而不是datetime(但它僅在2008年以後纔可用)。

datetime本身具有更有限的範圍(僅適用於從1753年開始,而不是從0年)和精密(毫秒值四捨五入到037結束最近的值)

datetime2(SQL服務器)和DateTime(.NET)兼容。


如何,精確,可以確保數據庫端使用datetime2可能取決於正是你用什麼樣的形式EF的。

+0

很好的答案,謝謝。如果我不需要1753年前的額外精度或日期,那麼它們對使用DateTime2有什麼好處?我看到MSDN推薦它,但我猜測額外的精度需要更多的空間? – Toby

+1

@託比 - 出人意料的不是。如果你看['datetime'](http://technet.microsoft.com/en-us/library/ms187819.aspx)和['datetime2'](http://technet.microsoft.com/en-us /library/bb677335.aspx),你會發現前者總是需要8個字節,而後者需要6-8個字節(取決於你要求的精度)。事實證明'datetime'對於存儲來說效率並不高。 –

+0

沒有意識到DateTime2,謝謝。 – ganders

4

是的,它們的格式是兼容的。但是,如果您試圖將SQL Server DateTime(GetDate())與VB DateTime.Now進行比較,我會謹慎的一件事。你不能保證那些是平等的。

+0

乾杯,感謝您的補充警告。 – Toby

1

其他的答案是大多糾正,該類型是兼容的,但他們並不準確相當於

最大的區別是達米恩描述瞭如何datetime有限的範圍和精度,而datetime2有一個DateTime和變量精度的全部範圍。

和甘德斯是正確的,你不能保證DateTime.Now == getdate()。大多數情況下,這是因爲時鐘在兩次通話之間消失,但​​也有可能從網絡服務器調用DateTime.Now,而從SQL Server調用getdate(),它們位於兩臺不同的計算機上。他們的時鐘可能不完全同步,或者他們可能有不同的時區設置。

但是還沒有討論的另一點是DateTime有其非常重要的.Kind屬性,它是三個DateTimeKind值之一。 Utc,LocalUnspecified。 SQL Server datetimedatetime2沒有這個概念。

因此,如果您有UtcLocalDateTime,當您保存並檢索它時,您會發現它現在是Unspecified。換句話說 - 這種類型在往返旅行中無法生存。

通過比較,相關。NET DateTimeOffset類型將與SQL Server datetimeoffset類型完全往返。

你可以在我的博客文章The Case Against DateTime.Now中閱讀更多關於這個(和其他問題)。

+0

謝謝@Matt。雖然我目前沒有必要完成往返,但我開始懷疑時區問題和服務器時間。任何人閱讀這個Q,我強烈建議點擊閱讀馬特的博客文章,因爲它非常有幫助。 – Toby