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


当前回答

我非常喜欢:

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

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

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

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

其他回答

以防有人在这里寻找一个Sybase版本,因为上面的几个版本都不能工作

CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)

在Adaptive Server 15.7上运行的I SQL v11中测试

在SQL Server 2008中,有一个DATE数据类型(也是一个TIME数据类型)。

CAST(GetDate() as DATE)

or

declare @Dt as DATE = GetDate()

我会用:

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。

看这个问题: 如何在SQL Server中截断日期时间?

无论你做什么,不要使用字符串方法。这是最糟糕的方法了。