Каков наилучший способ сравнить даты в предложении WHERE без функций? - PullRequest
0 голосов
/ 27 июня 2018

Я просматриваю сценарий, который унаследовал, и нашел его в предложении WHERE:

  WHERE
    CONVERT(DATE, changedon) = CONVERT(DATE, DATEADD(DAY, -1, GETDATE()))  

Получаются все записи, в которых изменено = дата предыдущего дня.

Я знаю, что вы не должны использовать функции в предложении WHERE, поэтому я пытаюсь выяснить, как переписать это. Поле «changeon» - это дата / время, поэтому я не совсем понимаю, как это сделать без использования CONVERT или CAST.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

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

Select * from mytable t where t.field-1 = x

База данных должна обрабатывать все записи в mytable. Лучший запрос:

Select * from mytable t where t.field = x+1

Надеюсь, это полезно.

0 голосов
/ 27 июня 2018

На самом деле, использование функций в этом случае нормально. Вопрос в том, будет ли SQL Server использовать индексы, и это делает исключение для приведения даты / времени к датам. Я думаю, что это единственное исключение.

Вы также можете переписать это как:

WHERE changedon >= CONVERT(DATE, DATEADD(DAY, -1, GETDATE()))  AND
      changedon < CONVERT(DATE, GETDATE())
...