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

比较T-SQL中的日期,忽略时间部分,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我使用的是MS SQL 2005,我想检查两个日期是否相等,但忽略了时间部分 我知道我可以利用,但我担心它可能会很慢-这个SP在DB中使用得很多 有什么建议吗 编辑:David Andres的评论:“‘比较’包含的远不止平等”让我意识到我的问题不够清楚——我实际上只是在检查平等性,仅此而已。最合理的方法是去掉日期时间值的时间部分并比较结果,从datetime中剥离时间部分的最佳方法如下: cast(current_timestamp as date) 我曾经使用并倡导一种类似于以下两行

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

我知道我可以利用,但我担心它可能会很慢-这个SP在DB中使用得很多

有什么建议吗


编辑:David Andres的评论:“‘比较’包含的远不止平等”让我意识到我的问题不够清楚——我实际上只是在检查平等性,仅此而已。

最合理的方法是去掉日期时间值的时间部分并比较结果,从datetime中剥离时间部分的最佳方法如下:

cast(current_timestamp as date)    
我曾经使用并倡导一种类似于以下两行之一的流程:

cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
但是现在SQLServer有了
Date
类型,它不包含时间组件,因此没有理由使用这两种技术

需要记住的另一件事是,如果需要对where子句或join条件中的每一行的两个datetime值执行查询,那么这仍然会使查询陷入困境。如果可能,您希望以某种方式将其分解,以便尽可能多地预先计算,例如使用视图或计算列


最后,请注意DATEDIFF函数比较跨越的边界数。这意味着,即使只经过了2秒,
'2009-09-14 11:59:59'
'2009-09-15 00:00:01'
之间的datediff(以天为单位)是1,但
'2009-09-15 00:00:01'
'2009-09-15 11:59:59'
之间的datediff(以天为单位)仍然是0,即使经过了86398秒。它根本不关心那里的时间部分,只关心边界。根据您的查询试图执行的操作,您可能能够利用这一点发挥自己的优势。

在我自己的工作中,当我想确定两个日期在一天中的任何时间都相等时,我使用了以下方法:

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101)
诚然,“比较”包含的内容远不止相等,上述内容在进行比较之前将日期转换为美国格式MM/DD/YYYY。因此,性能影响和无法比较日期差异


但是……它确实起作用。

如果您的数据模型不能很好地满足您的业务需求之一(例如,您需要比较日期,但您没有跟踪日期,只跟踪日期加时间),请查看调整模型的可能性,而不是处理方法

只将日期存储在索引计算列中,或者单独存储日期和时间部分,可能会有帮助吗?

其中DATEDIFF(day,date1,date2)=0

很抱歉回答得太晚

我总是使用这种语法进行日期比较

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

每当我们使用112格式代码转换日期时,它总是非常有效,返回日期为
yyyyMMdd
格式。它以字符串格式比较日期,没有时间,但效果很好。谢谢

不要担心过早优化:使用
DATEDIFF
编写查询,然后查看它是否是瓶颈,或者不检查查询计划。如果这是一个问题,寻找一个替代方法。可能的重复不是比只使用DATEDIFF(day,date1,date2)效率低吗?我不是在寻找一种去除时间的方法,而是一种忽略时间比较两个日期的方法。对我来说,这看起来有点慢。我所说的“其他”方法是一个计算列,它使用datatime列上的时间剥离代码进行计算。这将使sql server提前完成所有工作,因此您可以说“DateA-DateB”一个持久化的计算列将提前完成,一个视图和一个计算列只在需要时完成。您也可以使用“索引”视图提前完成这项工作。您的解决方案使用了我在“IF date\u column!=GETDATE()时编写的脚本没有。你知道为什么吗?