我已经阅读了几篇关于使用支持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
数据类型吗?
由于
答案 0 :(得分: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
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来获取大数据。