在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

其他回答

当然,这是一个旧的线程,但使它完整。

从SQL 2008你可以使用DATE数据类型,所以你可以简单地做:

SELECT CONVERT(DATE,GETDATE())

如果可能的话,对于这样的特殊情况,我喜欢使用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) 结束

我会用:

CAST
(
CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as 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。