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每天为我节省 2 mb 的旧版本吗?

或者

我应该使用新的强大的datetime2数据类型吗?

谢谢

4

2 回答 2

7

datetime2(2)是 6 个字节,不仅可以为您提供秒数,还可以为您提供最多 2 个毫秒的位置(00:00:00.00通过23:59:59.99)。

smalldatetime是 4 个字节,并且有可能为每行节省 2 个字节,如果此列是集群键的一部分,那么保存的这 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  |
+-------------------------+-------------------------+

datetime2(2)我真的不喜欢这种四舍五入,所以尽管每天节省 2mb,除非它是集群密钥的一部分,否则这对我来说可能就足够了。

参考:

于 2017-06-10T12:10:31.233 回答
3

日期范围:smalldatetime:1900-01-01 到 2079-06-06 和 datetime2:0001-01-01 到 9999-12-31

存储:如果您不需要秒,只需要几小时和几分钟,那么存储就像 smalldatetime 4 个字节,而不是 datetime2(0) 6 个字节。

datetime2 是值范围、精度(无舍入!)的升级,因此您应该使用 datetime2 来处理大数据。

于 2017-06-10T10:58:29.640 回答