Mereka tidak setara. Catatan yang 7 hari yang lalu, tetapi sebelum waktu saat ini hari - hanya akan dikembalikan dalam permintaan # 2:
Ketika membandingkan hari menggunakan DATEADD
fungsi , itu tidak mengambil bagian waktu menjadi pertimbangan . Fungsi akan mengembalikan 1 ketika membandingkan hari Minggu & Senin, terlepas dari waktu.
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.
Setara logis dari permintaan pertama yang akan memungkinkan penggunaan indeks potensial adalah dengan menghapus bagian waktu @DateTime
atau mengatur waktu untuk 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
Alasan mengapa kueri pertama tidak dapat menggunakan indeks LogInsertTime
adalah karena kolom dimakamkan dalam suatu fungsi. Kueri # 2 membandingkan kolom dengan nilai konstan yang memungkinkan pengoptimal untuk memilih indeks LogInsertTime
.
LogInsertTime
itu