Warm tip: This article is reproduced from serverfault.com, please click

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

(其他 - Best approach to remove time part of datetime in SQL Server)

发布于 2009-07-24 12:49:54

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

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

或者

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

第二种方法确实会多发送几个字节,但这可能不如转换速度重要。

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

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

Questioner
Stephen Perelson
Viewed
22
2,074 2020-12-29 19:53:59

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

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

已经证明在相同的总持续时间一百万行内占用更少的 CPU 密集度被手上有太多时间的人证明:SQL Server 中从日期+时间获取日期的最有效方法?

我在其他地方也看到过类似的测试,结果也类似。

我更喜欢 DATEADD/DATEDIFF 因为:

编辑,2011 年 10 月

对于SQL Server 2008+,你可以同时投射到dateCAST(getdate() AS date)或者只是使用date数据类型,所以不要time删除。

编辑,2012 年 1 月

这是多么灵活的一个工作示例:需要在 sql server 中按四舍五入的时间或日期数字计算

编辑,2012 年 5 月

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

现在,这确实有一个更高版本的 SQL Server 优化器版本正确管理 CAST 的示例,但通常这将是一个坏主意......

编辑,2018 年 9 月,日期时间 2

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)