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秒经过.请注意,它并不真正关心那里的时间部分.根据您的查询尝试执行的操作,您可以使用它来获得优势.
在我自己的工作中,当我想确定两个日期是平等的而不考虑时间时,我使用了以下内容:
WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101)
Run Code Online (Sandbox Code Playgroud)
当然,"比较"包括的不仅仅是平等,而且在进行比较之前,上述内容将日期转换为美国格式MM/DD/YYYY.因此,性能影响和无法比较日期差异.
但是......确实有效.