在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 CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

...根据下面的评论,这不是一个好的解决方案。

我想删除这个答案,但我把它留在这里作为一个反例,因为我认为评论者对为什么它不是一个好主意的解释仍然有用。

其他回答

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

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

select CONVERT(char(10), GetDate(),126)

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

CAST(GetDate() as DATE)

or

declare @Dt as DATE = GetDate()

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

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

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

对我来说,下面的代码总是一个赢家:

SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT,GETDATE())));