SQL Server smalldatetime与datetime2

时间:2017-06-10 10:17:37

标签: sql-server datetime2 smalldatetime

我已经阅读了几篇关于使用支持SQL Server中日期的数据类型的文章,但我仍未确定要使用哪种数据。

所有人都说使用新的强大datetime2类型,但smalldatetime在内存方面更方便(6个字节对4个字节)

这是我的范围:

以这种方式定义的表:

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

然后我有这些要求:

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

在此表中,我每天最多可存储<100万条记录这么大的大数据。

我的问题是:我是否必须使用每天节省2 mb的旧smalldatetype

OR

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

由于

2 个答案:

答案 0 :(得分:5)

datetime2(2)是6个字节,不仅可以获得秒数,还可以获得最多2个毫秒(00:00:00.0023: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  |
+-------------------------+-------------------------+

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

参考:

答案 1 :(得分:3)

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

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

datetime2是值范围的升级,精确度(没有舍入!),所以你应该使用datetime2来获取大数据。