在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的实现可以是你喜欢的任何东西——现在它被抽象了,调用代码更加简洁。

其他回答

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

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

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

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

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

我猜这个会比很多快。

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

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

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

select convert(datetime,ROUND(convert(float,[Modified]),0))
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)

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

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