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


当前回答

CAST(round(cast(getdate()as real),0,1) AS datetime)

此方法不使用字符串函数。日期基本上是一种真实的数据类型,小数点前的数字是一天的小数。

我猜这个会比很多快。

其他回答

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

SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT,GETDATE())));
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

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

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

当然,这是一个旧的线程,但使它完整。

从SQL 2008你可以使用DATE数据类型,所以你可以简单地做:

SELECT CONVERT(DATE,GETDATE())

严格来说,方法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)

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

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

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