Sie sind nicht gleichwertig. Datensätze, die vor 7 Tagen, aber vor der aktuellen Tageszeit erstellt wurden, werden nur in Abfrage 2 zurückgegeben:
Beim Vergleichen von Tagen mit der DATEADD
Funktion wird der Zeitteil nicht berücksichtigt . Die Funktion gibt beim Vergleich von Sonntag und Montag unabhängig von der Uhrzeit 1 zurück.
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.
Das logische Äquivalent der ersten Abfrage, die eine potenzielle Indexnutzung ermöglicht, besteht darin, entweder den Zeitteil von zu entfernen @DateTime
oder die Zeit auf Folgendes festzulegen 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
Der Grund, warum die erste Abfrage keinen Index für verwenden kann, LogInsertTime
liegt darin, dass die Spalte in einer Funktion vergraben ist. Abfrage Nr. 2 vergleicht die Spalte mit einem konstanten Wert, mit dem der Optimierer einen Index für auswählen kann LogInsertTime
.
LogInsertTime
ist?