¿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)?
LogInsertTime
esRespuestas:
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:
LogDateTime
está 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
DATE
tipo 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
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:
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 para0:00:00
: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 índiceLogInsertTime
.fuente