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


当前回答

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

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

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

其他回答

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

CONVERT(DATE, getdate(), 101)

严格来说,方法a是资源密集度最低的:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

经过证明,在相同的总持续时间内,对于那些有太多时间的人来说,更少的CPU密集型:SQL Server中从日期+时间获得日期的最有效方法?

我在其他地方看到了类似的测试,结果也类似。

我更喜欢DATEADD/DATEDIFF,因为:

Varchar受语言/日期格式问题的影响 示例:为什么我的CASE表达式是非确定性的? Float依赖于内部存储 它扩展到通过改变“0”基数来计算每月的第一天、明天等

编辑,2011年10月

对于SQL Server 2008+,您可以CAST到日期,即CAST(getdate() AS date)。或者只是使用日期数据类型,所以没有时间删除。

编辑,2012年1月

这是多么灵活的一个工作示例:需要在sql server中按四舍五入的时间或日期图进行计算

编辑,2012年5月

不要在WHERE子句和类似的地方使用这个:向列添加函数或CAST会使索引使用无效。参见第2条SQL编程常见错误

现在,这确实有一个SQL Server优化器版本正确管理CAST到日期的例子,但通常这将是一个坏主意…

编辑,2018年9月,datetime2

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)

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

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

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

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

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

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