在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的时间部分?
严格来说,方法a是资源密集度最低的:
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
经过证明,在相同的总持续时间内,对于那些有太多时间的人来说,更少的CPU密集型:SQL Server中从日期+时间获得日期的最有效方法?
我在其他地方看到了类似的测试,结果也类似。
我更喜欢DATEADD/DATEDIFF,因为:
Varchar受语言/日期格式问题的影响
示例:为什么我的CASE表达式是非确定性的?
Float依赖于内部存储
它扩展到通过改变“0”基数来计算每月的第一天、明天等
编辑,2011年10月
对于SQL Server 2008+,您可以CAST到日期,即CAST(getdate() AS date)。或者只是使用日期数据类型,所以没有时间删除。
编辑,2012年1月
这是多么灵活的一个工作示例:需要在sql server中按四舍五入的时间或日期图进行计算
编辑,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)
在这里,我做了一个函数来删除SQL Server的日期时间的某些部分。用法:
第一个参数是要剥离的datetime。
第二个参数是char类型:
S:转到秒;删除毫秒
M:数到分钟;删除秒和毫秒
H:转到小时;删除分钟、秒和毫秒。
D:轮到天;删除小时、分钟、秒和毫秒。
返回新的日期时间
创建函数dbo。uf_RoundDateTime(@dt作为datetime, @part作为char)
返回日期时间
作为
开始
如果CHARINDEX(@part, 'smhd',0) = 0返回@dt;
返回演员(
案例@part
当's'时,convert(varchar(19), @dt, 126)
当'm'时,则convert(varchar(17), @dt, 126) + '00'
当'h'时,则convert(varchar(14), @dt, 126) + '00:00'
当'd'时,convert(varchar(14), @dt, 112)
结束为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