พวกเขาจะไม่เทียบเท่า บันทึกที่ 7 วันที่ผ่านมา แต่ก่อนเวลาปัจจุบันของวัน - จะถูกส่งกลับในแบบสอบถาม # 2:
เมื่อเปรียบเทียบวันโดยใช้DATEADD
ฟังก์ชั่น , มันไม่ได้ใช้เวลาส่วนหนึ่งมาพิจารณา ฟังก์ชันจะส่งคืน 1 เมื่อเปรียบเทียบวันอาทิตย์และวันจันทร์โดยไม่คำนึงถึงเวลา
การสาธิต:
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.
ตรรกะเทียบเท่าของแบบสอบถามแรกที่จะช่วยให้การใช้ดัชนีที่มีศักยภาพคือการลบส่วนเวลา@DateTime
หรือเพื่อกำหนดเวลาไปที่0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
สาเหตุที่แบบสอบถามแรกไม่สามารถใช้ดัชนีLogInsertTime
ได้เนื่องจากคอลัมน์ถูกฝังอยู่ภายในฟังก์ชัน แบบสอบถาม # 2 LogInsertTime
เปรียบเทียบคอลัมน์เพื่อค่าคงที่ซึ่งจะช่วยเพิ่มประสิทธิภาพในการเลือกดัชนีบน
LogInsertTime
ใด