Они не эквивалентны. Записи, которые были 7 дней назад, но до текущего времени суток - будут возвращены только в запросе № 2:
При сравнении дней с использованием DATEADD
функции , она не принимает часть времени во внимание . Функция вернет 1 при сравнении воскресенья и понедельника независимо от времени.
Демо-версия:
DECLARE @MyTable TABLE(pk INT, LogInsertTime DATETIME);
INSERT @MyTable
VALUES (1, DATEADD(HOUR, 1, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE))AS DATETIME))),
(2, DATEADD(HOUR, 23, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE)) AS DATETIME)));
DECLARE @DateTime DATETIME = GETDATE();
SELECT *
FROM @MyTable
WHERE DATEDIFF(DAY, LogInsertTime, @DateTime) > 7;
-- 0 records.
SELECT *
FROM @MyTable
WHERE LogInsertTime < @DateTime - 7;
-- 1 record.
Логическим эквивалентом первого запроса, который позволит использовать потенциальные индексы, является либо удаление части времени, @DateTime
либо установка времени 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
Причина, по которой первый запрос не может использовать индекс, LogInsertTime
заключается в том, что столбец скрыт внутри функции. Запрос № 2 сравнивает столбец с постоянным значением, которое позволяет оптимизатору выбирать индекс LogInsertTime
.
LogInsertTime
есть?