Non sono equivalenti. I record che sono 7 giorni fa, ma prima dell'ora corrente del giorno - verranno restituiti solo nella query n. 2:
Quando si confrontano i giorni utilizzando la DATEADD
funzione , non prende in considerazione la parte temporale . La funzione restituirà 1 quando si confrontano domenica e lunedì, indipendentemente dagli orari.
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.
L'equivalente logico della prima query che consentirà un potenziale utilizzo dell'indice è rimuovere la parte temporale @DateTime
o impostare l'ora su 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
Il motivo per cui la prima query non può utilizzare un indice LogInsertTime
è perché la colonna è sepolta all'interno di una funzione. La query n. 2 confronta la colonna con un valore costante che consente all'ottimizzatore di scegliere un indice LogInsertTime
.
LogInsertTime
è?