在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的时间部分?


当前回答

把插入/更新的时间放在首位。至于动态转换,没有什么能比得上用户定义函数的可维护性:

select date_only(dd)

date_only的实现可以是你喜欢的任何东西——现在它被抽象了,调用代码更加简洁。

其他回答

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

date_only的实现可以是你喜欢的任何东西——现在它被抽象了,调用代码更加简洁。

我会用:

CAST
(
CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as datetime
) 

因此,有效地从已有的日期字段创建一个新字段。

我非常喜欢:

[date] = CONVERT(VARCHAR(10), GETDATE(), 120)

120格式代码将强制将日期转换为ISO 8601标准:

'YYYY-MM-DD' or '2017-01-09'

在dplyr (R)和pandas (Python)中超级容易使用!

我认为如果你严格使用TSQL,这是截断时间的最快方法:

 select convert(datetime,convert(int,convert(float,[Modified])))

我发现这种截断方法比DateAdd方法快5%左右。这可以很容易地修改为四舍五入到最近的一天,像这样:

select convert(datetime,ROUND(convert(float,[Modified]),0))