在SQL Server中从datetime字段中删除时间部分时,哪种方法提供了最佳性能?
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
or
b) select cast(convert(char(11), getdate(), 113) as datetime)
第二种方法确实发送了更多的字节,但这可能没有转换速度那么重要。
两者看起来也都非常快,但在处理数十万行或更多行的时候,速度可能会有所不同。
此外,是否可能有更好的方法来消除SQL中datetime的时间部分?
我想你的意思是
将(floor(Cast (getdate()as float))转换为datetime
Real只有32位,可能会丢失一些信息
这是最快的
Cast (getdate()+x-0.5 as int)as datetime
...虽然只快了约10% (CPU约0.49微秒vs. 0.58微秒)
这是推荐的,并且在我刚才的测试中花费了相同的时间:
DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
在SQL 2008中,SQL CLR函数比使用SQL函数快5倍,1.35微秒比6.5微节,这表明SQL CLR函数比简单的SQL UDF函数调用开销要低得多。
在SQL 2005中,根据我的测试,SQL CLR函数比这个慢函数快16倍:
create function dateonly ( @dt datetime )
returns datetime
as
begin
return cast(floor(cast(@dt as float))as int)
end
这是来自另一个重复问题的另一个答案:
SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime)
这个魔数方法比DATEADD方法执行得稍微快一些。(看起来像~10%)
百万记录数轮的CPU时间:
DATEADD MAGIC FLOAT
500 453
453 360
375 375
406 360
但请注意,这些数字可能无关紧要,因为它们已经非常快了。除非我有100,000或更多的记录集,否则我甚至无法让CPU时间读数高于零。
考虑到DateAdd就是为了这个目的,而且更健壮,我建议使用DateAdd。