比较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有Date
types,它不包含时间组件,没有什么理由使用这两种技术之一。
还有一件事要记住,如果您需要为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,但很好的作品。 谢谢