我正在使用MS SQL 2005,我想检查两个日期是否相等,但忽略了时间部分。
我知道我可以使用DATEDIFF,但我担心它可能会很慢 - 这个SP在数据库中被大量使用了!
有什么建议吗?
编辑: David Andres的评论:
'“比较”包含的不仅仅是平等'让我意识到我没有明白我的问题足够 - 我实际上只是在检查是否平等,就是这样。
答案 0 :(得分:89)
唯一合理的方法是去除日期时间值的时间部分并比较结果,从日期时间中删除时间部分的最佳方法是这样的:
cast(current_timestamp as date)
我曾经使用并提倡一个看起来像以下两行之一的流程:
cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
但是现在Sql Server的Date
类型没有时间组件,没有理由使用其中任何一种技术。
这里需要记住的另一件事是,如果你需要为where子句或连接条件中的每一行的两个日期时间值执行此操作,这仍然会使查询陷入困境。如果可能的话,你想要以某种方式将其考虑在内,以便尽可能地预先计算它,例如使用视图或计算列。
最后,请注意DATEDIFF函数会比较交叉边界的数量。因此,'2009-09-14 11:59:59'
和'2009-09-15 00:00:01'
之间的日期值为1,即使仅过了2秒,但'2009-09-15 00:00:01'
和'2009-09-15 11:59:59'
之间的DATEDIFF仍然为零,甚至虽然经过了86,398秒。请注意,它并不真正关心那里的时间部分。根据您的查询尝试执行的操作,您可能可以使用它。
答案 1 :(得分:37)
WHERE DATEDIFF(day,date1,date2)= 0
答案 2 :(得分:7)
在我自己的工作中,当我想确定两个日期是否相等而不考虑时间时,我使用了以下内容:
WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101)
当然,“比较”包括的不仅仅是相等而且上述内容在进行比较之前将日期转换为美国格式MM / DD / YYYY。因此,性能影响和无法比较日期差异。
但是......确实有效。
答案 3 :(得分:4)
如果您的数据模型没有很好地满足您的某项业务要求(例如,您需要比较日期,但您没有跟踪日期,只记录日期加时间),请查看有可能调整模型,而不是应对它的方法。
将日期存储在索引计算列中,或者单独存储日期和时间部分是否可行且有用?
答案 4 :(得分:3)
对不起,迟到了。
我总是使用这种语法进行日期比较
WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112)
每当我们使用112格式代码转换日期时它总是很有效,它以yyyyMMdd
格式返回日期。它没有时间比较字符串格式的日期,但效果很好。感谢