这两个查询在逻辑上是等价的吗?
DECLARE @DateTime DATETIME = GETDATE()
查询 1
SELECT *
FROM MyTable
WHERE Datediff(DAY, LogInsertTime, @DateTime) > 7
查询 2
SELECT *
FROM MyTable
WHERE LogInsertTime < @DateTime - 7
如果它们在逻辑上不等价,你能给我第一个查询的逻辑等价物,以便 WHERE 子句可以有效地使用索引(即消除函数包装)吗?
您发布的两个查询在逻辑上是否等效是无关紧要的;你不应该使用它们中的任何一个。我会尽量引导你远离一些事情:
LogDateTime
它被索引(或可能永远被索引)。我不喜欢速记日期数学,我建议不要这样做。当然,它的输入速度更快,但是尝试使用
DATE
数据类型,你会得到一个丑陋的错误。最好把它拼出来,例如:我会使用以下 sargeable 查询:
原因:我相信 @DateTime-7 的结果没有记录在案。即使它恰好等同于 DATEADD(DAY, -7, @DateTime),它也可能会在以后的版本中中断。
它们不等价。7 天前但在当前时间之前的记录 - 只会在查询 #2 中返回:
使用该
DATEADD
函数比较天数时,不考虑时间部分。无论时间如何,比较星期日和星期一时,该函数将返回 1。演示:
启用潜在索引使用的第一个查询的逻辑等效项是删除时间部分
@DateTime
或将时间设置为0:00:00
:第一个查询不能使用索引的
LogInsertTime
原因是因为该列被隐藏在一个函数中。查询 #2 将该列与一个常量值进行比较,该常量值使优化器能够在 上选择一个索引LogInsertTime
。