Ils ne sont pas équivalents. Les enregistrements datant de 7 jours, mais antérieurs à l' heure actuelle , ne seront renvoyés que dans la requête n ° 2:
Lors de la comparaison des jours à l'aide de la DATEADD
fonction , elle ne prend pas en compte la partie temps . La fonction renverra 1 lors de la comparaison dimanche et lundi, quelles que soient les heures.
Démo:
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'équivalent logique de la première requête qui permettra l'utilisation potentielle de l'index est de supprimer la partie temporelle de @DateTime
ou de définir l'heure sur 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
La raison pour laquelle la première requête ne peut pas utiliser un index LogInsertTime
est parce que la colonne est enterrée dans une fonction. La requête n ° 2 compare la colonne à une valeur constante qui permet à l'optimiseur de choisir un index LogInsertTime
.
LogInsertTime
est ce type ?