Essas duas consultas são logicamente 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
Se eles não forem logicamente equivalentes, você pode me fornecer o equivalente lógico da primeira consulta para que a cláusula WHERE possa efetivamente usar um índice (por exemplo, eliminar o agrupamento de funções)?
LogInsertTime
éRespostas:
Se as duas consultas que você postou são logicamente equivalentes é irrelevante; você não deve usar nenhum deles. Vou tentar afastar você de algumas coisas:
LogDateTime
estiver indexada (ou pode estar).Eu não gosto da matemática da taquigrafia e recomendo contra ela. Claro, é mais rápido digitar, mas tente isso com um
DATE
tipo de dados e você receberá um erro feio. Muito melhor explicitar, por exemplo:fonte
Eu usaria a seguinte consulta sargível:
O motivo: acredito que o resultado do @ DateTime-7 não está documentado. Mesmo que isso seja equivalente a DATEADD (DAY, -7, @DateTime), ele poderá ser interrompido em uma versão posterior.
fonte
- (Subtract): Subtracts two numbers (an arithmetic subtraction operator). Can also subtract a number, in days, from a date.
. Ainda assim, concordo que o uso de funções explícitas de data torna a consulta resultante mais legível e mantida do que a "mágica do operador aritmético".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:
O equivalente lógico da primeira consulta que permitirá o uso potencial do índice é remover a parte da hora
@DateTime
ou definir a hora para0:00:00
: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 índiceLogInsertTime
.fonte