2

我正在尝试使用 VB.NET EntityFramework 添加一个新记录,其中一个字段的类型为 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 提供的方法。

4

3 回答 3

5

是的,它们的格式是兼容的。但是,如果您尝试将 SQL Server DateTime (GetDate()) 与 VB DateTime.Now 进行比较,我会注意一件事。你不能保证这些都是平等的。

于 2013-08-21T12:49:19.337 回答
4

如果可能,您希望使用 SQL Serverdatetime2而不是datetime(但它仅在 2008 年以后可用)。

datetime本身具有更有限的范围(仅从 1753 年开始,而不是从 0 年开始)和精度(毫秒值四舍五入到以0,3或结尾的最接近的值7

datetime2(SQL Server) 和DateTime(.NET) 是兼容的。


确切地说,您如何确保数据库端正在使用datetime2可能取决于您使用的是哪种形式的 EF。

于 2013-08-21T12:52:56.820 回答
1

其他答案大多是正确的,因为类型是兼容的,但它们并不完全相同

最大的不同是 Damien 描述的范围和精度如何datetime有限,而datetime2具有全范围DateTime和可变精度。

甘德斯是正确的,你不能保证DateTime.Now == getdate()。这主要是因为您的呼叫之间的时钟滴答作响,但也有可能DateTime.Now是从 Web 服务器getdate()调用并从 SQL Server 调用,它们位于两台不同的计算机上。他们的时钟可能不完全同步,或者他们可能有不同的时区设置。

但还有一点没有讨论,它DateTime有它非常重要的.Kind属性,它是三个DateTimeKind值之一。, Utc,LocalUnspecified. SQL Serverdatetime还是datetime2没有这个概念的。

所以如果你有一个Utcor Localkind DateTime,当你保存再检索它的时候,你会发现它就是 now Unspecified。换句话说 - 那种不能在往返中存活下来。

相比之下,相关的 .NETDateTimeOffset类型将与 SQL Server 类型完全往返datetimeoffset

您可以在我的博客文章The Case Against DateTime.Now中阅读有关此(和其他问题)的更多信息。

于 2013-08-21T17:11:23.713 回答