SQL Server日期与smalldatetime的区别

19

我有一堆表格,它们在不同的级别上汇总数据:季度、小时、日和月。除此之外还有一个包含“原始”数据的基础表格,它包含一些额外的列。所有汇总表格都具有相同的列。

基础、季度和小时表格使用smalldatetime类型的列来对数据进行时间戳。这个列也会出现在小时和日表格中,但当然我在这里不需要时间方面的信息。

为了简单起见,我想在这里也使用smalldatetime数据类型,但是也许对于性能来说使用日期数据类型更好?

在性能方面,这两种类型之间是否存在真正的差异?


1
SMALLDATETIME在SQL Server 2008中已被弃用。请使用DATE、TIME或DATETIME2。http://msdn.microsoft.com/en-us/library/ms182418.aspx - nvogel
谢谢。好的,我的问题最终也会是一样的:datetime vs date。 - Gerrie Schenck
4
@dportas说:smalldatetime并没有过时:它也是ANSI标准类型之一。 - gbn
1
@gbn,你从哪里得到的信息,说smalldatetime是“ANSI”标准类型?你指的是SQL标准的哪个版本?在ISO/IEC 9075 2003文档中没有这个类型。我现在手头没有所有早期版本,但我非常确定标准日期时间类型一直是TIMESTAMP,而不是SMALLDATETIME,后者是Sybase的发明。根据我已经发布的链接,Microsoft已经弃用了SMALLDATETIME。 - nvogel
@dportas:这是BOL在弃用时所说的内容http://msdn.microsoft.com/en-us/library/ms182776.aspx。但你对于smalldatetime标准是正确的。 - gbn
1
@sqlvogel建议的链接明确表示smalldatetime不符合ANSI或ISO 8601标准,但令人惊讶的是,在SQL Server 2012版本中我也看到了它的可用性。该链接表示适用于_SQL Server 2008及以上版本_,但未提及弃用。 - RBT
5个回答

18

通常使用尽可能小的数据类型是个好主意。你不应该使用varchar(max)甚至是varchar(10)来存储一个2个字符长度的州缩写。

同样地,如果你只需要日期(比如4/11/2001),那么使用Date类型而不是DateTime类型。

虽然在性能上它可能没有太大的改善(DateTime比Date多5个字节),但如果你有多个字段和/或多行记录,这些改进可以开始累积。


2
是的,我同意。此外,我找到了一篇关于这个主题的好文章:http://www.mssqltips.com/tip.asp?tip=1616。虽然不是关于性能的,但它比较了存储日期的不同解决方案。 - Gerrie Schenck

6

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

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

如果您在日期列上的表之间进行JOIN操作,或者如果不保留最小可能的日期类型,则应保留一个日期类型(在此示例中为4字节的smalldatetime),以存储小时和季度,以及date用于纯日期。


1

范围

SmallDateTime:1900年1月1日至2079年6月6日 DateTime:1753年1月1日至9999年12月31日

精度

SmallDateTime:分钟 DateTime:三百分之一秒(3.33)

存储

SmallDateTime:4字节 DateTime:8字节


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时,午夜过后的这一秒就消失了。


0

不幸的是,在使用 bcp(批量复制)实用程序进行导出/导入操作时,smalldatetime 对我造成了麻烦。BCP 导入似乎不喜欢 smalldatetime 字段(至少在它们被 BCP 导出时)。即使在 SQL Server 2008 版本中并使用 bcp 中的“本地”格式也是如此。因此,将来我会使用 datetime 进行我的工作,因为我喜欢能够使用 bcp 来移动数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接