SQL-запрос между тремя датами - PullRequest
0 голосов
/ 21 сентября 2018

Я просто хотел посмотреть, есть ли лучший способ сделать запрос, подобный этому, я думаю, что приведение в предложении where является узким местом, но не уверен, что это лучший способ исправить это.План выполнения имеет 34% - это вставка во временную таблицу, а 42% - это хэш-совпадение.

SET @StartDate = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + -12, 0)
SET @EndDate = DATEADD(MILLISECOND, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0))

where cast(ITF.Date as DATE) BETWEEN CAST(@StartDate as date) 
      AND CAST(@EndDate as date)

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Казалось бы, вы хотите:

where ITF.Date >= CAST(@StartDate as date) and
      ITF.Date < dateadd(day, 1, CAST(@EndDate as date))

Блог Аарона Бертранда «Что общего между Дьяволом и Дьяволом» довольно хорошо объясняет, почему вы не должны использовать between сзначения даты / времени.

Обратите внимание, добавляя «1» к дате окончания.Ваш код включает дату окончания, также как и эта версия.

0 голосов
/ 21 сентября 2018

Наиболее подходящий способ проверить, находится ли значение DATETIME между двумя DATE с, - это использовать date1 <= datetime AND datetime < date2, где date2 на один день больше последней даты, которая должна быть включена.

Это не потребует приведения к столбцам даты и времени и учитывает крайние случаи, когда столбец даты и времени содержит значение времени, например 23:59:59.999999, и позволяет избежать определенных уловок , таких как вычитание хака за 3 миллисекунды.

WHERE ITF.Date >= CAST(@StartDate as date) AND ITF.Date < CAST(@EndDate as date)
0 голосов
/ 21 сентября 2018

В зависимости от остальной части вашего запроса, исключение @StartDate и @EndDate cast приведет к ускорению вашего запроса на основе моего опыта начиная с SQL 6.5.

DECLARE @StartDate Date DECLARE @EndDate Date

0 голосов
/ 21 сентября 2018

Часть кода, который вы опубликовали, в порядке и не является причиной каких-либо проблем с производительностью.

Если вы получаете Hash Match в вашем плане выполнения, это означает, что вы пропустили один или несколько индексов, вероятно, в столбцах, к которым присоединяются две таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...