哪一个:
日期时间日期时间2
在SQL Server 2008+中存储日期和时间的建议方法是什么?
我知道精度(可能还有存储空间)的差异,但现在忽略这些,是否有关于何时使用what的最佳实践文档,或者我们应该只使用datetime2?
哪一个:
日期时间日期时间2
在SQL Server 2008+中存储日期和时间的建议方法是什么?
我知道精度(可能还有存储空间)的差异,但现在忽略这些,是否有关于何时使用what的最佳实践文档,或者我们应该只使用datetime2?
当前回答
datetime2在除(旧应用兼容性)之外的大多数方面都获胜
较大的值范围更好的准确性较小的存储空间(如果指定了可选的用户指定精度)
请注意以下几点
语法datetime2[(小数秒精度=>低于存储大小)]精度,刻度0至7位,精度为100ns。默认精度为7位数。存储大小精度小于3时为6字节;精度3和4为7字节。所有其他精度要求8字节。DateTime2(3)的位数与DateTime相同,但使用7字节的存储,而不是8字节(SQLHINTS-DateTime Vs DateTime2)查找有关datetime2的详细信息(Transact-SQL MSDN文章)
图像来源:MCTS自学训练套件(考试70-432):Microsoft®SQL Server®2008-实施和维护第3章:表格->第1课:创建表格->第66页
其他回答
老问题。。。但我想补充一些这里没有人说过的话。。。(注:这是我自己的观察结果,所以不要要求任何参考)
在筛选条件中使用Datetime2更快。
TLDR:
在SQL 2016中,我有一个包含十万行和日期时间列ENTRY_TIME的表,因为它需要存储精确到秒的时间。当我使用where子句作为:
WHERE ENTRY_TIME >= '2017-01-01 00:00:00' AND ENTRY_TIME < '2018-01-01 00:00:00'
最初,当有数百行时,查询很好,但当行数增加时,查询开始出现以下错误:
Execution Timeout Expired. The timeout period elapsed prior
to completion of the operation or the server is not responding.
我删除了where子句,出乎意料的是,查询在1秒内运行,尽管现在所有日期的所有行都已提取。我用where子句运行内部查询,用了85秒,没有where子句用了0.01秒。
我在这里遇到了许多关于日期时间过滤性能的线程
我优化了一下查询。但我得到的真正速度是将datetime列更改为datetime2。
现在,以前超时的同一个查询只需要不到一秒钟的时间。
干杯
如果您是Access开发人员,试图将Now()写入相关字段,则DateTime2会造成严重破坏。刚刚执行了Access->SQL 2008 R2迁移,它将所有日期时间字段作为DateTime2放入。当值爆炸时,用Now()追加一条记录。2012年1月1日下午2:53:04没事,但2012年10月1日凌晨2:53:44没有。
一旦性格改变了。希望它能帮助到某人。
我刚刚偶然发现了DATETIME2的另一个优点:它避免了Python adodbapi模块中的一个错误,如果传递标准库datetime值,该值对于datetime列具有非零微秒,但如果将该列定义为DATETIME2,则会很好。
正如其他答案所示,由于尺寸更小、精度更高,建议使用datetime2,但以下是Nikola Ilic关于为什么不使用datetime1的一些想法:
缺少(简单)对日期进行基本数学运算的可能性,如GETDATE()+1每次使用DATEADD或DATEDIFF进行比较时,都会完成到datetime的隐式数据转换SQL Server无法正确使用Datetime2列的统计信息,因为存储数据的方式会导致非最佳查询计划,从而降低性能
虽然datetime2提高了精度,但有些客户端不支持date、time或datetime2,并强制您转换为字符串文本。微软特别提到了ODBC、OLE DB、JDBC和SqlClient这些数据类型的“底层”问题,并有一个图表显示了它们如何映射类型。
如果值兼容性超过精度,请使用datetime