Eşdeğer değiller. 7 gün önce, ancak günün geçerli saatinden önce olan kayıtlar yalnızca # 2 numaralı sorguda döndürülür:
Kullanarak gün karşılaştırıldığında DATEADD
fonksiyonu , bu dikkate zaman yer almaz . İşlev, pazar gününden Pazartesi gününe göre saatlerden bağımsız olarak 1 döndürecektir.
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.
Potansiyel dizin kullanımını etkinleştirecek ilk sorgunun mantıksal eşdeğeri, ya zaman bölümünü kaldırmak ya da saati şu @DateTime
şekilde ayarlamaktır 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
İlk sorgunun bir dizini kullanamamasının LogInsertTime
nedeni, sütunun bir işlev içinde gömülü olmasıdır. Sorgu 2, sütunu, optimize edicinin üzerinde bir dizin seçmesini sağlayan sabit bir değerle karşılaştırır LogInsertTime
.
LogInsertTime
?