datetime2(0)与datetime2(2)


16

根据文档datetime2(Transact-SQL)

存储大小
6字节,精度低于3。7
字节,精度3和4。
所有其他精度要求8字节。

的大小datetime2(0)datetime2(1)datetime2(2)使用相同的存储量(6个字节)。

我是否可以在datetime2(2)不增加任何尺寸费用的情况下继续使用并获得精度的好处是否正确?

请注意:

  • 该列用PK索引,以形成复合聚集索引(用于表分区)
  • 我不在乎毫秒

datetime2(0)在where子句中使用或在索引中查找时,CPU效率会更高吗?

这是一个庞大的表,因此最小的优化将有很大的不同。

Answers:


27

dateTime2(0),dateTime2(1),dateTime2(2),dateTime2(3)的大小使用相同的存储量。(6字节)

我是否可以正确地说,我也可以使用dateTime2(3)并获得精度的好处而无需任何额外的大小费用。

不,您误解了文档。请注意,文档指出存储大小为6个字节,而精度小于 3(强调我的)。因此,等于3的精度将需要7个字节。

如果您不在乎毫秒,datetime2(0)将是适当的数据类型和精度。最佳实践是根据存储的数据指定适当的数据类型和精度,因为这将固有地提供最佳的存储和效率。话虽如此,只要存储大小相同,基于指定的datetime2精度,我预计不会对性能造成重大影响,但我自己尚未对此进行专门测试。

当源中有更高的精度时,应用程序需求将决定必须存储在数据库中的内容。例如,对于来自的订单输入时间SYSDATETIME(),用户可能不需要100纳秒的精度。再次,根据需求选择用于新开发的数据类型和精度,通常您将获得最佳性能而无需额外考虑:

尽管datetime2最适合上面列出的新开发,但有时可能需要使用datetime(精度为1/300小数秒的固定精度3)来代替与旧的datetime应用程序的兼容性,从而避免隐式转换和意外的比较行为,但是小数秒精度和增加存储的代价。

考虑到存储比所需精度更高的精度可能还会带来开发成本。如果仅在需要整秒精度的情况下存储一个带有小数秒的时间分量,则查询仍将需要考虑小数秒以返回正确的结果。例如,对于一个用户通过仅允许整秒的UI选择时间范围的应用,该应用代码将需要考虑结束时间范围值中的小数秒,并相应地调整用户提供的值(例如WHERE OrderEntryTime BETWEEN '2017-01-11T08:00:00.00.00' AND '2017-01-11T08:59:59.99'WHERE OrderEntryTime >= '2017-01-11T08:00:00.00' AND OrderEntryTime < '2017-01-11T09:00:00.00')。这将增加代码复杂度。


抱歉,仅在这条小纸条上碰到这个旧线程,但是smalldatetime确实有整秒(即hh:mm:ss)。
pgfiore19年


@pgfiore,smalldatetime文件规定一分钟的准确度,你会发现它是正确的SELECT CAST(GETDATE() AS smalldatetime);
丹·古兹曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.