SQL Server中的DateTime2与DateTime有何区别?

884

哪一个:

是在 SQL Server 2008+ 中存储日期和时间的推荐方法

我知道它们在精度(和存储空间可能)上有所不同,但暂时忽略这些差异,是否有最佳实践文件来指导何时使用什么,或者我们应该只使用 datetime2

17个回答

6
根据这篇文章,如果您想要使用DateTime2来获得与DateTime相同的精度,只需使用DateTime2(3)即可。这将为您提供相同的精度,占用更少的字节,并提供扩展范围。

要明确的是,它具有与 SQL datetime 相同的精度,而不是 .NET DateTime。 - Sam Rueby
没错,我假设每个人都能理解上下文,但特别说明一下也是值得的。 - jKlaus

4

我刚刚发现了DATETIME2的另一个优点:它避免了Python adodbapi模块中的一个错误,如果将具有非零微秒的标准库datetime值传递给DATETIME列,则该模块会崩溃,但如果将该列定义为DATETIME2则可以正常工作。


2
正如其他答案所示,由于体积更小、精度更高,建议使用datetime2,但以下是一些关于为什么不使用datetime2的思考(作者:Nikola Ilic):
  • 缺乏对日期进行基本数学运算(如GETDATE()+1)的简单方法。
  • 每次使用DATEADDDATEDIFF进行比较时,都会隐式地将数据转换为datetime类型。
  • 由于存储方式导致查询计划不够优化,SQL Server 无法正确使用Datetime2列的统计信息,从而降低了性能。

"由于数据存储方式导致非最优查询计划,SQL Server无法有效地对Datetime2列使用统计信息,从而降低了性能。需要引用来源。" - Milney
@Milney 这句话是从所提到的文章中引用的(倒数第三段)。文章链接为:https://towardsdatascience.com/datetime2-why-you-should-not-use-it-70e50ae2bab9。 - robotik

0

我认为使用DATETIME2来存储日期是更好的方式,因为它比DATETIME更高效。在SQL Server 2008中,您可以使用DATETIME2,它可以存储日期和时间,需要6-8个字节进行存储,并具有100纳秒的精度。因此,任何需要更高时间精度的人都会选择DATETIME2


0

接受的答案很好,只是要知道如果你将DateTime2发送到前端 - 它会被四舍五入为普通的DateTime等效项。

这对我造成了问题,因为在我的解决方案中,当重新提交时,我必须比较发送的内容与数据库中的内容,而我的简单比较'=='没有考虑到四舍五入。所以必须添加它。


-1

datetime2 更好

  • datetime 范围:1753年01月01日至9999年12月31日,datetime2 范围:0001年01月01日至9999年12月31日

  • datetime 精度:0.00333 秒,datetime2 精度:100 纳秒

  • datetime 占用 8 字节,datetime2 根据精度占用 6 到 8 字节

    (精度小于 3 的占用 6 字节,精度为 3 或 4 的占用 7 字节,所有其他精度都需要 8 字节,请点击下面的图片查看)

enter image description here


-3
Select ValidUntil + 1
from Documents

上述SQL语句无法与DateTime2字段一起使用。它会返回一个错误:"操作数类型冲突:datetime2与int不兼容"

添加1以获取下一天是开发人员多年来处理日期的常见方法。现在,微软有了一个超级新的datetime2字段,却无法处理这个简单的功能。

"让我们使用这种比旧类型更糟糕的新类型",我不这么认为!


2
只是为了明确,datetimedatetime2数据类型都是在SQL Server 2008中引入的。您还会从自古以来就存在的date类型中获得Operand type clash: date is incompatible with int。这三种数据类型都可以很好地与dateadd(dd, 1, ...)一起使用。 - AlwaysLearning
3
这不是很清楚。我有一个SQLServer 2005数据库,其中包含一个datetime字段。 - Paul McCarthy
datetime在Microsoft SQL Server 4.0中可用,当时代码库仍与sybase共享。我不确定确切的版本是何时添加的,但它已经存在很长时间了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接