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'
)。这将增加代码复杂度。