从 SQL Server 中的日期时间字段中删除时间部分时,哪种方法可提供最佳性能?
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
要么
b) select cast(convert(char(11), getdate(), 113) as datetime)
第二种方法确实会发送更多字节,但这可能不如转换速度重要。
两者似乎也都非常快,但是在处理数十万或更多行时可能存在速度差异?
此外,是否有更好的方法来摆脱 SQL 中日期时间的时间部分?
严格来说,方法a是资源最少的:
a
被手头有太多时间的人证明在相同的总持续时间内一百万行的 CPU 密集度较低:SQL Server 中从日期+时间获取日期的最有效方法?
我在其他地方也看到了类似的测试,结果也类似。
我更喜欢 DATEADD/DATEDIFF 因为:
varchar 受语言/日期格式问题的影响 示例:为什么我的 CASE 表达式是不确定的?
float 依赖于内部存储
编辑,2011 年 10 月
对于 SQL Server 2008+,您可以转换为dateie CAST(getdate() AS date)。或者只是使用date数据类型,所以不要time删除。
date
CAST(getdate() AS 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)