Sql server VB.Net DateTime与SQL DateTime匹配吗?
我正在尝试使用VB.NET EntityFramework添加一个新记录,其中的字段类型为DateTime 这两种类型的DateTime是否匹配,以允许直接保存而无需任何强制转换或格式设置 也就是说,应该进行以下工作(其中表是WidgetResult,我尝试添加新记录)Sql server VB.Net DateTime与SQL DateTime匹配吗?,sql-server,vb.net,datetime,Sql Server,Vb.net,Datetime,我正在尝试使用VB.NET EntityFramework添加一个新记录,其中的字段类型为DateTime 这两种类型的DateTime是否匹配,以允许直接保存而无需任何强制转换或格式设置 也就是说,应该进行以下工作(其中表是WidgetResult,我尝试添加新记录) 我在这方面查阅了很多其他帖子,但它们似乎都与插入查询有关,而不是使用EF提供的方法。是的,它们的格式是兼容的。但是,如果您试图将SQL Server DateTime(GetDate())与VB DateTime.Now进行比较
我在这方面查阅了很多其他帖子,但它们似乎都与插入查询有关,而不是使用EF提供的方法。是的,它们的格式是兼容的。但是,如果您试图将SQL Server DateTime(GetDate())与VB DateTime.Now进行比较,有一件事我会非常小心。您不能保证它们是相等的。如果可能,您希望SQL Server使用而不是(但它仅从2008年起可用)
datetime
本身具有更有限的范围(仅从1753年起,而不是从0年起)和精度(毫秒值四舍五入到以0
、3
或7
结尾的最近值)
DateTime 2
(SQL Server)和DateTime
(.NET)是兼容的
确切地说,您如何确保数据库端使用的是
datetime2
,这可能取决于您使用的EF的具体形式。其他答案基本上是正确的,因为类型是兼容的,但它们并不完全相同
最大的区别是Damien所描述的datetime
的范围和精度是有限的,而datetime2
的范围是datetime
和可变精度的
Ganders是正确的,您不能保证DateTime.Now==getdate()
。这主要是因为时钟在两次调用之间滴答作响,但也可能是DateTime.Now
是从web服务器调用的,而getdate()
是从SQL服务器调用的,它们位于两台不同的计算机上。他们的时钟可能没有完全同步,或者他们可能有不同的时区设置
但是另一个没有讨论的点是,DateTime
有其非常重要的.Kind
属性,它是三个DateTimeKind
值之一。Utc
,本地
,或未指定
。SQL Serverdatetime
或datetime2
没有此概念
因此,如果您有Utc
或Local
类型的DateTime
,当您保存并检索它时,您会发现它现在是未指定的。换言之,这种方式在往返旅行中无法生存
相比之下,相关的.NETDateTimeOffset
类型将与SQL ServerDateTimeOffset
类型完全往返
你可以在我的博客文章中了解更多关于这一点(以及其他问题)。是的,你试过了吗?™回答得好,谢谢。如果我不需要额外的精度或1753年以前的日期,那么使用DateTime2有什么好处吗?我看到MSDN推荐了它,但我猜额外的精度会占用更多的空间吗?@Toby-令人惊讶的是不会。如果你看一下,你会发现前者总是需要8个字节,而后者需要6-8个字节(取决于你要求的精度)。原来datetime
的存储效率不高。谢谢@Matt。虽然我现在不需要完成往返行程,但我已经开始怀疑时区问题和服务器时间。如果有人读了这个问题,我强烈建议大家点击阅读Matt的博客文章,因为这非常有帮助。
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