比较T-SQL中的日期,忽略时间部分

Fio*_*ite 61 sql t-sql sql-server sql-server-2005

我正在使用MS SQL 2005,我想检查两个日期是否相等,但忽略了时间部分.

我知道我可以使用DATEDIFF,但我担心它可能会很慢 - 这个SP在DB中被大量使用!

有什么建议?

编辑:大卫安德烈斯的评论:

"比较"不仅包括"平等"
让我意识到我没有让我的问题足够清楚 - 我实际上只是在检查是否平等,就是这样.

Joe*_*orn 92

唯一合理的方法是去除日期时间值的时间部分并比较结果,从日期时间中删除时间部分的最佳方法是这样的:

cast(current_timestamp as date)    
Run Code Online (Sandbox Code Playgroud)

我曾经使用并提倡一个看起来像以下两行之一的流程:

cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
Run Code Online (Sandbox Code Playgroud)

但是现在Sql Server具有Date不包含时间组件的类型,没有理由使用这些技术中的任何一种.

这里要记住的另一件事是,如果你需要为where子句或连接条件中的每一行的两个日期时间值执行此操作,那么这仍然会使查询陷入困境.如果可能的话,你想以某种方式将其考虑在内,以便尽可能地预先计算它,例如使用视图或计算列.

最后,请注意DATEDIFF函数会比较交叉边界的数量.所以之间的天DATEDIFF '2009-09-14 11:59:59''2009-09-15 00:00:01'为1,即使只有2秒钟之经过,但之间的天DATEDIFF '2009-09-15 00:00:01''2009-09-15 11:59:59'仍为零,即使86398秒经过.请注意,它并不真正关心那里的时间部分.根据您的查询尝试执行的操作,您可以使用它来获得优势.

  • 这不会比仅使用_D​​ATEDIFF(day,date1,date2)_效率低吗? (4认同)
  • 我并不是在寻找一种方法来消除时间,而是一种比较两个日期而忽略时间的方法.这看起来有点慢我.. (2认同)

pet*_*ete 37

WHERE DATEDIFF(day,date1,date2)= 0


Dav*_*res 7

在我自己的工作中,当我想确定两个日期是平等的而不考虑时间时,我使用了以下内容:

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101)
Run Code Online (Sandbox Code Playgroud)

当然,"比较"包括的不仅仅是平等,而且在进行比较之前,上述内容将日期转换为美国格式MM/DD/YYYY.因此,性能影响和无法比较日期差异.

但是......确实有效.