sql - sql Serve最好方法来移除datetime的时间部分

  显示原文与译文双语对照的内容

当从 SQL Server 中的日期时间字段中删除时间部分时,哪个方法提供最佳性能?


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

或者


b) select cast(convert(char(11), getdate(), 113) as datetime)

第二种方法是发送几个字节,但这可能不如转换的速度那么重要。

两者看起来都非常快,但在处理hundreds-of-thousands或者更多行时,速度可能有差异?

还有,是否有更好的方法来消除SQL中datetime的时间部分?

时间:

下面是另一个重复问题的答案:


SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime)

这里幻数方法比DATEADD方法执行稍微快一点。 ( 看起来像 ~10%)

在数百万记录中的CPU时间:


DATEADD MAGIC FLOAT
500 453
453 360
375 375
406 360

但是请注意这些数字可能无关紧要,因为它们已经非常快。 除非我有 100,000个或者更多的记录集,否则我甚至无法在上面读取CPU时间。

考虑到DateAdd是用于这个目的并且更健壮的事实,我要说使用 DateAdd 。

第一次插入/更新时的条带时间。 对于on-the-fly转换,没有什么可以击败user-defined函数 maintanability-wise:

 
select date_only(dd)

 

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

已经回答了,但我也把它扔在那里。 这suposedly也预先形成,但作品扔掉的十进制( 存储时间) 只漂浮并返回整个部分(日期)


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

第二次我找到这个解决方案。。 我从 。获取了这里代码


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

这里方法不使用字符串函数。 Date 基本上是一个实数数据类型,数字是小数的一部分。

我想会比很多更快。

...