哪一个:

日期时间日期时间2

在SQL Server 2008+中存储日期和时间的建议方法是什么?

我知道精度(可能还有存储空间)的差异,但现在忽略这些,是否有关于何时使用what的最佳实践文档,或者我们应该只使用datetime2?


当前回答

正如其他答案所示,由于尺寸更小、精度更高,建议使用datetime2,但以下是Nikola Ilic关于为什么不使用datetime1的一些想法:

缺少(简单)对日期进行基本数学运算的可能性,如GETDATE()+1每次使用DATEADD或DATEDIFF进行比较时,都会完成到datetime的隐式数据转换SQL Server无法正确使用Datetime2列的统计信息,因为存储数据的方式会导致非最佳查询计划,从而降低性能

其他回答

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

正如其他答案所示,由于尺寸更小、精度更高,建议使用datetime2,但以下是Nikola Ilic关于为什么不使用datetime1的一些想法:

缺少(简单)对日期进行基本数学运算的可能性,如GETDATE()+1每次使用DATEADD或DATEDIFF进行比较时,都会完成到datetime的隐式数据转换SQL Server无法正确使用Datetime2列的统计信息,因为存储数据的方式会导致非最佳查询计划,从而降低性能

MSDN datetime文档建议使用datetime2。以下是他们的建议:

使用time、date、datetime2和新的datetimeoffset数据类型工作这些类型与SQL一致标准它们更便于携带。time、datetime2和datetimeoffset提供更多的秒精度。datetimeoffset提供时区支持全球部署应用。

datetime2具有更大的日期范围、更大的默认小数精度和可选的用户指定精度。还取决于用户指定的精度,它可能使用更少的存储空间。

Select ValidUntil + 1
from Documents

上面的SQL不适用于DateTime2字段。它返回错误“操作数类型冲突:datetime2与int不兼容”

添加1以获得第二天,这是开发人员多年来一直在使用日期的做法。现在微软有了一个超级新的datetime2字段,无法处理这个简单的功能。

“让我们使用比旧型号更糟糕的新型号”,我不这么认为!

DATETIME2的日期范围为“0001/01/01”到“9999/12/31”,而DATETIME类型仅支持1753-9999年。

此外,如果需要,DATETIME2可以在时间方面更精确;DATETIME限制为3 1/3毫秒,而DATETIME2可以精确到100ns。

这两种类型都映射到.NET中的System.DateTime-没有区别。

如果您有选择,我建议尽可能使用DATETIME2。我看不出使用DATETIME有什么好处(除了向后兼容)-你会有更少的麻烦(日期超出范围和麻烦)。

另外:如果您只需要日期(没有时间部分),请使用date-它与DATETIME2一样好,也可以节省空间!:-)同样只适用于时间-使用time。这就是这些类型的原因!