从SQL Server的datetime字段中删除时间部分时,哪种方法提供最佳性能?
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中从date + time获取日期的最有效方法?
我在其他地方也看到了类似的测试,结果也差不多。
我更喜欢DATEADD / DATEDIFF,因为:
varchar受到语言/日期格式问题的影响 示例:为什么我的CASE表达式是不确定的?
浮动依赖于内部存储
编辑,2011年10月
对于SQL Server 2008+,您可以CAST到dateie CAST(getdate() ASdate)。或者只是使用date数据类型,所以不要time删除它。
date
CAST(getdate() ASdate)
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)