SQL Server smalldatetime与datetime2的区别

4

我读过几篇关于在SQL Server中使用支持日期的数据类型的文章,但我仍然不确定要使用哪种数据。

所有人都建议使用新的强大的datetime2类型,但是从内存的角度来看,smalldatetime仍然更加方便(6字节对4字节)。

这是我的目标:

以这种方式定义的表:

Date: typeof(<Date type to choose>)
Value1: typeof(int)
Value2: typeof(int)
Value3: typeof(int)

我有以下要求:

对于 Date 列,我需要精确到分钟。

在此表中,我每天将存储多达 100 万条记录,所以是大数据量。

我的问题是:我是否必须使用旧的 smalldatetype 每天可以节省2MB的空间?

还是应该使用新而强大的 datetime2 数据类型?

谢谢


1
只需选择最适合您所需范围和精度的数据类型,您就会获得存储优势。如果您不需要秒数,请使用smalldatetime。请参见https://dba.stackexchange.com/questions/160709/sql-datetime20-vs-datetime22/160713#160713。 - Dan Guzman
我看了那篇文章,但仍不清楚是在旧结构上获得2个字节更好,还是在现代结构上支付2个字节。 - Oscar Peli
2个回答

7

datetime2(2) 是6个字节,不仅可以获得秒数,还可以获得毫秒的两位数(00:00:00.0023:59:59.99)。

smalldatetime 是4个字节,如果此列是聚集键的一部分,则每行可节省2个字节,这些节省的字节将影响每个非聚集索引。

smalldatetime 的一个重要特点是它四舍五入到最近的分钟,而不是截断秒。根据数据插入到表中的方式以及是否需要此行为,您可能需要在将其插入表之前对该值进行额外的预处理。

示例:

create table t (sdt smalldatetime, dt2 datetime2(2))
insert into t values 
 ('2017-01-01T11:22:22.33','2017-01-01T11:22:22.33')
,('2017-01-01T11:22:33.33','2017-01-01T11:22:33.33')

select 
    sdt = convert(char(23),sdt,121)
  , dt2 = convert(char(23),dt2,121) 
from t

rextester演示:http://rextester.com/JPMEE57778

返回:

+-------------------------+-------------------------+
|           sdt           |           dt2           |
+-------------------------+-------------------------+
| 2017-01-01 11:22:00.000 | 2017-01-01 11:22:22.33  |
| 2017-01-01 11:23:00.000 | 2017-01-01 11:22:33.33  |
+-------------------------+-------------------------+

我真的不喜欢这种四舍五入,所以即使每天节省2MB,除非它是聚集键的一部分,否则我可能会选择datetime2(2)

参考:


我不需要这种舍入方式,因为我的数据在客户端已经被规范化了,所以秒总是“00”。数据每15分钟存储一次。 - Oscar Peli
1
将时间舍入到分钟可能会很麻烦,特别是因为它可以向上舍入到“尚未发生的时间”,并且可能会破坏那些出于可疑原因而假定更强排序的东西。问我怎么知道的 D: 强调这种差异值得投票支持。 - user2864740

3

日期范围:smalldatetime:1900年01月01日至2079年06月06日,datetime2:0001年01月01日至9999年12月31日。

存储:如果您不需要秒,只需要小时和分钟,则存储方式与4字节的smalldatetime相同,而不是6字节的datetime2(0)。

datetime2具有更大的值范围和精度(无需四舍五入!),因此对于大数据应使用datetime2。


所有数据都在客户端进行规范化处理,每15分钟存储一次,无需等待。 - Oscar Peli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接