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

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

其他回答

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

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

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

我非常喜欢:

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

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

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

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

把插入/更新的时间放在首位。至于动态转换,没有什么能比得上用户定义函数的可维护性:

select date_only(dd)

date_only的实现可以是你喜欢的任何东西——现在它被抽象了,调用代码更加简洁。

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

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

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

小心!

方法a)和b)并不总是有相同的输出!

select DATEADD(dd, DATEDIFF(dd, 0, '2013-12-31 23:59:59.999'), 0)

输出:2014-01-01 00:00:00.000

select cast(convert(char(11), '2013-12-31 23:59:59.999', 113) as datetime)

输出:2013-12-31 00:00:00.000

(在MS SQL Server 2005和2008 R2上测试)

编辑:根据Adam的评论,如果从表中读取日期值,则不会发生这种情况,但如果将日期值作为文本提供(例如:作为通过ADO.NET调用的存储过程的参数),则会发生这种情况。