在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的时间部分?
如果可能的话,对于这样的特殊情况,我喜欢使用CLR函数。
在这种情况下:
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlDateTime DateOnly(SqlDateTime input)
{
if (!input.IsNull)
{
SqlDateTime dt = new SqlDateTime(input.Value.Year, input.Value.Month, input.Value.Day, 0, 0, 0);
return dt;
}
else
return SqlDateTime.Null;
}
在这里,我做了一个函数来删除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)
结束
这是来自另一个重复问题的另一个答案:
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。