Почему DateAdd () и DATEDIFF () дают разные результаты и что лучше по производительности? - PullRequest
1 голос
/ 04 апреля 2019

В настоящее время я пытаюсь выполнить свой SQL-запрос двумя различными способами.

WHERE order_date_time >= DateAdd(month,-3,getdate())

и

WHERE DATEDIFF(month,order_date_time,GetDate()) <= 3

1) Почему я получаю 2 разных результата?Разве я не получаю ту же стоимость, что и при попытке найти записи за последние 3 месяца или менее?

Не правильно ли я рассчитываю разницу в 3 месяца в предложении where?

2)Какая функция лучше и дает результаты быстрее с точки зрения производительности?

Ответы [ 2 ]

4 голосов
/ 04 апреля 2019

DATEDIFF подсчитывает количество «тиков» между 2 датами. Так, например, DATEDIFF(MONTH,'2019-01-31T23:59:59','2019-02-01T00:00:00') возвращает 1, даже если прошла только 1 секунда; месяц изменился (поэтому произошел один «тик»).

С точки зрения того, что «лучше», это зависит от ваших требований, однако, WHERE DATEDIFF(MONTH,order_date_time,GETDATE()) <= 3 здесь не рекомендуется, так как это не SARGable. Это потому что order_date_time содержится в функции DATEDIFF.

Я бы использовал WHERE order_date_time >= DATEADD(MONTH,-3,GETDATE()) (при условии, что вам нужны строки, где order_date_time - последние 3 месяца).

3 голосов
/ 04 апреля 2019

Это ваши условия:

WHERE order_date_time >= DateAdd(month, -3, getdate())
WHERE DATEDIFF(month, order_date_time, GetDate()) <= 3

Самое главное.,,Они делают разные вещи.Первый возвращается три месяца.Итак, если сегодня 15 апреля, то после 15 января он берет все.

Второй смотрит на границы месяца .Таким образом, он подсчитывает весь январь одинаково и принимает все значения с 1 января.

Хотя вы должны использовать нужную вам версию, первая версия намного, намного лучше.По сути, он может использовать индексы и разделы.Вызов функции DATEDIFF() затрудняет (невозможно?) Для оптимизатора использование индексов для order_date_time.

Если вы намереваетесь использовать вторую форму, я бы рекомендовал перефразировать ее примерно так:

WHERE order_date_time >= datefromparts(year(dateAdd(month, -3, getdate())), month(dateAdd(month, -3, getdate())), 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...