Nie są równoważne. Rekordy sprzed 7 dni, ale przed bieżącą porą dnia - zostaną zwrócone tylko w zapytaniu nr 2:
Porównując dni za pomocą DATEADD
funkcji , nie bierze się pod uwagę części czasu . Funkcja zwróci 1 podczas porównywania niedzieli i poniedziałku, bez względu na porę.
Próbny:
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.
Logicznym odpowiednikiem pierwszego zapytania, które umożliwi potencjalne użycie indeksu, jest usunięcie części czasu @DateTime
lub ustawienie czasu na 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
Powodem, dla którego pierwsze zapytanie nie może użyć indeksu, LogInsertTime
jest to, że kolumna jest zakopana w funkcji. Zapytanie nr 2 porównuje kolumnę ze stałą wartością, która umożliwia optymalizatorowi wybór indeksu LogInsertTime
.
LogInsertTime
jest?