¿Son estas dos consultas lógicamente equivalentes?
DECLARE @DateTime DATETIME = GETDATE()
Consulta 1
SELECT *
FROM MyTable
WHERE Datediff(DAY, LogInsertTime, @DateTime) > 7
Consulta 2
SELECT *
FROM MyTable
WHERE LogInsertTime < @DateTime - 7
Si no son lógicamente equivalentes, ¿puede darme el equivalente lógico de la primera consulta para que la cláusula WHERE pueda usar efectivamente un índice (es decir, eliminar el ajuste de función)?

LogInsertTimeesRespuestas:
Si las dos consultas que publicó son lógicamente equivalentes es irrelevante; no deberías usar ninguno de ellos. Intentaré alejarte de un par de cosas:
LogDateTimeestá indexada (o podría estarlo).No me gustan las matemáticas de la fecha abreviada y recomiendo no hacerlo. Claro, es más rápido escribir, pero intente eso con un
DATEtipo de datos y obtendrá un error feo. Mucho mejor para explicarlo, por ejemplo:fuente
Usaría la siguiente consulta sargeable:
El motivo: creo que el resultado de @ DateTime-7 no está documentado. Incluso si resulta ser equivalente a DATEADD (DAY, -7, @DateTime), puede romperse en una versión posterior.
fuente
- (Subtract): Subtracts two numbers (an arithmetic subtraction operator). Can also subtract a number, in days, from a date.. Aún así, estoy de acuerdo en que el uso de funciones de fecha explícitas hace que la consulta resultante sea más legible y mantenible que la "magia del operador aritmético".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
DATEADDfunció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:
El equivalente lógico de la primera consulta que permitirá el uso potencial del índice es eliminar la parte del tiempo
@DateTimeo establecer el tiempo para0:00:00:La razón por la cual la primera consulta no puede usar un índice
LogInsertTimees 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 índiceLogInsertTime.fuente