No son equivalentes. Los registros de hace 7 días, pero antes de la hora actual del día , solo se devolverán en la consulta n.º 2:
Al comparar días usando la DATEADD
función , no toma en cuenta la parte del tiempo . La función devolverá 1 al comparar domingo y lunes, independientemente de los horarios.
Manifestación:
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.
El equivalente lógico de la primera consulta que permitirá el uso potencial del índice es eliminar la parte del tiempo @DateTime
o establecer el tiempo para 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
La razón por la cual la primera consulta no puede usar un índice LogInsertTime
es porque la columna está enterrada dentro de una función. La consulta n. ° 2 compara la columna con un valor constante que permite al optimizador elegir un índice LogInsertTime
.
LogInsertTime
es