小编典典

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

all

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

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

要么

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

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

两者似乎也都非常快,但是在处理数十万或更多行时可能存在速度差异?

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


阅读 554

收藏
2022-03-08

共1个答案

小编典典

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

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

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

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

我更喜欢 DATEADD/DATEDIFF 因为:

编辑,2011 年 10 月

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

编辑,2012 年 5 月

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

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

编辑,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)
2022-03-08