SQL Server日期与smalldatetime

时间:2011-04-11 13:38:31

标签: sql-server

我有一堆表来整合不同级别的数据:季度,小时,每日和每月。除此之外,还有一个包含“原始”数据的基表,这个数据包含一些额外的列。统一表格都具有相同的列。

base,quarter和hourly表使用类型smalldatetime的列来为数据加时间戳。此列也将在每小时和每日表格中提供,但当然我不需要时间方面。

为了简单起见,我也希望在这里使用smalldatetime数据类型,但是对于列的日期数据类型,性能可能更好吗?

在性能方面,这些类型之间是否存在很大差异?

5 个答案:

答案 0 :(得分:14)

使用您需要的最小数据类型通常是个好主意。您不应该使用varchar(max)或甚至varchar(10)来存储2个字符的州名缩写。

从同样的意义上说,如果您只需要日期(例如4/11/2001),那么请使用日期类型而不是日期时间类型。

虽然它可能不是一个巨大的性能提升(DateTime比Date大5个字节。)如果你有多个字段和/或多行,它可以开始加起来。

答案 1 :(得分:4)

各种数据类型具有各种size 影响数据/索引的大小,这比查询性能(I / O成本)更重要。

另一方面,数据类型之间的转换可能成本很高。此外,各种数据类型之间的隐式转换可能是错误/意外的。

如果你在日期列的表之间加入,或者如果不保持最小的日期类型 - smalldatetime用于存储小时数,我将保留一种类型的日期(在这种情况下为4个字节smalldatetime)季度和date 日期。

答案 2 :(得分:0)

不幸的是,在smalldatetime的情况下,当我使用bcp(批量复制)实用程序进行导出/导入操作时,它会给我带来麻烦。 BCP导入似乎与smalldatetime字段不同(至少在BCP导出时)。版本晚于SQL Server 2008并在bcp中使用“本机”格式。因此,我将来会使用datetime作为我的工作,因为我希望能够使用bcp来移动数据。

答案 3 :(得分:0)

范围

SmallDateTime:1 - 1月 - 1900年至6月6日 - 2079年 日期时间:1 - jan -1753至31 - Dec - 9999

精确度

SmallDateTime:分钟 日期时间:百分之三秒(3.33)

存储

SmallDateTime:4个字节 日期时间:8个字节

答案 4 :(得分:0)

检查一下:

当你必须从varchar(max)转换为datetime时:

declare @s varchar(max)
set @s = '2018-06-01 00:00:01'
select CONVERT(smalldatetime, @s )
select CONVERT(datetime,@s )

结果到此

2018-06-01 00:00:00
2018-06-01 00:00:01.000

这个过去的午夜时间在转换为smalldatetime时消失了