Eles não são equivalentes. Os registros 7 dias atrás, mas antes da hora atual do dia - serão retornados somente na consulta 2:
Ao comparar os dias usando a DATEADD
função , ela não leva em consideração a parte do tempo . A função retornará 1 ao comparar domingo e segunda-feira, independentemente dos horários.
Demo:
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.
O equivalente lógico da primeira consulta que permitirá o uso potencial do índice é remover a parte da hora @DateTime
ou definir a hora para 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
A razão pela qual a primeira consulta não pode usar um índice LogInsertTime
é porque a coluna está oculta dentro de uma função. A consulta 2 compara a coluna a um valor constante que permite ao otimizador escolher um índice LogInsertTime
.
LogInsertTime
é