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

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

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

有什么build议么?

编辑: David Andres的评论:

“比较”不仅包括平等“

让我意识到我没有把我的问题弄清楚 – 我其实只是检查平等,就是这样。

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

 cast(current_timestamp as date) 

我曾经使用和倡导一个看起来像下面两行之一的过程:

 cast(floor(cast(getdate() as float)) as datetime) dateadd(dd,0, datediff(dd,0, getDate())) 

但是现在,Sql Server有Datetypes,它不包含时间组件,没有什么理由使用这两种技术之一。

还有一件事要记住,如果您需要为where子句或连接条件中的每一行创build两个date时间值,那么这仍然会妨碍查询。 如果可能的话,你想把它分解出来,以便尽可能预先计算出来,例如使用视图或计算列。

最后,请注意DATEDIFF函数比较交叉边界的数量。 所以在'2009-09-14 11:59:59''2009-09-15 00:00:01'之间'2009-09-14 11:59:59'天数是1,尽pipe只有2秒过去了,但是在'2009-09-15 00:00:01' “DATEDIFF '2009-09-15 00:00:01''2009-09-15 11:59:59' '2009-09-15 00:00:01'仍然是零,即使86,398秒过去了。 请注意,它并不真正关心那里的时间部分。 根据您的查询要做什么,您可能能够使用这个优势。

WHERE DATEDIFF(day,date1,date2)= 0

在我自己的工作中,当我想确定两个date是平等的,而不pipe一天中的哪个时间,我已经使用了以下内容:

 WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

当然,“比较”不仅包括平等,而且在进行比较之前,上述将date转换为美国格式MM / DD / YYYY。 所以,性能影响和无法比较date差异。

但是…它确实有效。

如果您的业务需求中有一个不适合您的数据模型(例如,您需要比较date,但不loggingdate,只loggingdate和时间),请查看可能性调整模型,而不是应付它的方法。

将date存储在索引计算列中,还是分别存储date和时间部分是否可行和有帮助?

对不起,迟到的答案。

我总是使用这个语法进行date比较

 WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

只要我们用112格式的代码转换date,它总是很好用,它返回date为yyyyMMdd格式。 它比较没有时间的string格式的date,但很好的作品。 谢谢