Chúng không tương đương. Các bản ghi cách đây 7 ngày, nhưng trước thời điểm hiện tại trong ngày - sẽ chỉ được trả về trong truy vấn # 2:
Khi so sánh ngày sử dụng DATEADD
hàm , nó không xem xét phần thời gian . Hàm sẽ trả về 1 khi so sánh Chủ nhật & Thứ hai, bất kể thời gian.
Bản giới thiệu:
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.
Tương đương logic của truy vấn đầu tiên sẽ cho phép sử dụng chỉ mục tiềm năng là loại bỏ phần thời gian của @DateTime
hoặc để đặt thời gian thành 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
Lý do tại sao truy vấn đầu tiên không thể sử dụng một chỉ mục trên LogInsertTime
là vì cột được chôn trong một hàm. Truy vấn # 2 so sánh cột với giá trị không đổi cho phép trình tối ưu hóa chọn chỉ mục trên LogInsertTime
.
LogInsertTime
gì?