SQL Server smalldatetime与datetime2

Osc*_*eli 2 sql-server smalldatetime datetime2

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

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

这是我的范围:

以这种方式定义的表:

Date: typeof(<Date type to choose>)
Value1: typeof(int)
Value2: typeof(int)
Value3: typeof(int)
Run Code Online (Sandbox Code Playgroud)

然后我有这些要求:

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

在这个表中,我每天将存储多达一百万条如此大的大数据。

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

要么

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

谢谢

Sql*_*Zim 5

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
Run Code Online (Sandbox Code Playgroud)

extrester演示: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  |
+-------------------------+-------------------------+
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢这种舍入方法,因此datetime2(2)尽管每天节省2mb钱,除非它是群集密钥的一部分,否则这足以满足我的需求。

参考: