小编典典

在SQL Server中删除日期时间的时间部分的最佳方法

sql

从SQL Server的datetime字段中删除时间部分时,哪种方法提供最佳性能?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

或者

b) select cast(convert(char(11), getdate(), 113) as datetime)

第二种方法的确以任何一种方式发送了更多的字节,但这可能不如转换速度那么重要。

两者看起来都非常快,但是处理成千上万行或更多行时速度可能会有所不同?

另外,是否有更好的方法可以消除SQL中日期时间的时间部分?


阅读 192

收藏
2021-05-05

共1个答案

小编典典

严格来说,方法a耗费的资源最少:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

事实证明,花了太多时间的人在相同的总持续时间(一百万行)中占用了太多CPU资源:SQL Server中从date +
time获取日期的最有效方法?

我在其他地方也看到了类似的测试,结果也差不多。

我更喜欢DATEADD / DATEDIFF,因为:

编辑,2011年10月

对于SQL Server 2008+,您可以CAST到dateie CAST(getdate() ASdate)。或者只是使用date数据类型,所以不要time删除它。

编辑,2012年5月

不要在WHERE子句等中使用此功能,而无需考虑:向列中添加函数或CAST会使索引使用无效。请参阅此处的2号常见SQL编程错误

现在,这确实有一个示例,该示例说明了可以正确管理CAST的最新SQL Server优化程序版本,但 通常 这是一个坏主意…

编辑,2018年9月,适用于datetime2

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)
2021-05-05