그것들은 동등하지 않습니다. 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
입니까?