SQL DateDifference в предложении where - PullRequest
12 голосов
/ 11 марта 2011

Я делаю запрос следующим образом:

SELECT
  *
FROM a
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3;

и не работает

Я пытаюсь получить данные не старше 3 дней.

SQL-сервер.

Как это сделать?

DATEDIFF работает слишком медленно ..

Ответы [ 3 ]

28 голосов
/ 11 марта 2011

DateDiff очень быстро ... Ваша проблема в том, что вы запускаете его для значения столбца таблицы базы данных, поэтому обработчик запросов должен запускать функцию для каждой строки таблицы, даже если для этого столбца был индекс , Это означает, что он должен загрузить всю таблицу с диска.

Вместо этого используйте функцию dateAdd в текущую дату и сравните столбец таблицы базы данных с результатом этого единственного вычисления. Теперь он запускается DateAdd() только один раз и может использовать индекс (если он существует) для загрузки только тех строк, которые соответствуют критерию предиката.

Where a.DateValue > DateAdd(day,-3,getdate())

выполнение этого таким образом делает ваш предикат запроса SARG-способным

1 голос
/ 11 марта 2011

Документация Microsoft на http://msdn.microsoft.com/en-us/library/aa258269%28v=sql.80%29.aspx предполагает, что вместо DateTimeNow у вас должно быть getdate(). Так лучше работает?

0 голосов
/ 11 марта 2011

Ваш запрос не кажется плохим. Еще один способ решения этой проблемы:

SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE())
...