在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;
    }

其他回答

如何选择cast(cast my_datetime_field as date) as datetime)?结果是相同的日期,时间设置为00:00,但避免了任何文本转换,也避免了任何显式的数字舍入。

SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)

在SQL Server 2008中,您可以使用:

CONVERT(DATE, getdate(), 101)

我想你的意思是 将(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

我已经回答过了,但我也要把这个说出来…… 这应该也表现得很好,但它的工作原理是从浮点数中扔掉小数(存储时间),只返回整部分(即日期)

 CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)

我第二次找到这个解决方案…我把这个代码抄下来了