哪一个:
日期时间日期时间2
在SQL Server 2008+中存储日期和时间的建议方法是什么?
我知道精度(可能还有存储空间)的差异,但现在忽略这些,是否有关于何时使用what的最佳实践文档,或者我们应该只使用datetime2?
哪一个:
日期时间日期时间2
在SQL Server 2008+中存储日期和时间的建议方法是什么?
我知道精度(可能还有存储空间)的差异,但现在忽略这些,是否有关于何时使用what的最佳实践文档,或者我们应该只使用datetime2?
当前回答
MSDN datetime文档建议使用datetime2。以下是他们的建议:
使用time、date、datetime2和新的datetimeoffset数据类型工作这些类型与SQL一致标准它们更便于携带。time、datetime2和datetimeoffset提供更多的秒精度。datetimeoffset提供时区支持全球部署应用。
datetime2具有更大的日期范围、更大的默认小数精度和可选的用户指定精度。还取决于用户指定的精度,它可能使用更少的存储空间。
其他回答
我刚刚偶然发现了DATETIME2的另一个优点:它避免了Python adodbapi模块中的一个错误,如果传递标准库datetime值,该值对于datetime列具有非零微秒,但如果将该列定义为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。这就是这些类型的原因!
MSDN datetime文档建议使用datetime2。以下是他们的建议:
使用time、date、datetime2和新的datetimeoffset数据类型工作这些类型与SQL一致标准它们更便于携带。time、datetime2和datetimeoffset提供更多的秒精度。datetimeoffset提供时区支持全球部署应用。
datetime2具有更大的日期范围、更大的默认小数精度和可选的用户指定精度。还取决于用户指定的精度,它可能使用更少的存储空间。
下面的示例将向您展示smalldatetime、datetime、datetime2(0)和datetime2(7)之间存储大小(字节)和精度的差异:
DECLARE @temp TABLE (
sdt smalldatetime,
dt datetime,
dt20 datetime2(0),
dt27 datetime2(7)
)
INSERT @temp
SELECT getdate(),getdate(),getdate(),getdate()
SELECT sdt,DATALENGTH(sdt) as sdt_bytes,
dt,DATALENGTH(dt) as dt_bytes,
dt20,DATALENGTH(dt20) as dt20_bytes,
dt27, DATALENGTH(dt27) as dt27_bytes FROM @temp
返回
sdt sdt_bytes dt dt_bytes dt20 dt20_bytes dt27 dt27_bytes
------------------- --------- ----------------------- -------- ------------------- ---------- --------------------------- ----------
2015-09-11 11:26:00 4 2015-09-11 11:25:42.417 8 2015-09-11 11:25:42 6 2015-09-11 11:25:42.4170000 8
因此,如果我想将信息存储到秒,而不是毫秒,那么如果我使用datetime2(0)而不是datetime或datetime 2(7),我可以每个存储2个字节。
老问题。。。但我想补充一些这里没有人说过的话。。。(注:这是我自己的观察结果,所以不要要求任何参考)
在筛选条件中使用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。
现在,以前超时的同一个查询只需要不到一秒钟的时间。
干杯