Сравнение дат с использованием медленной производительности результатов

Я использую следующее условие в моем предложении where запроса:

CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112))  
        > = CONVERT(INT, CONVERT(VARCHAR(10), CCM.START_DATE, 112))
AND 
CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112)) 
        < ISNULL(convert(int, convert(varchar(10), CCM.[END_DATE], 112)), 20161001) 

При выполнении запроса с использованием вышеуказанного условия требуется много времени для возврата вывода.

Есть ли способ получить более быстрый результат?


person Ankur Jain    schedule 15.02.2017    source источник
comment
Вам нужно преобразовать значения?   -  person jarlh    schedule 15.02.2017


Ответы (1)


Прошу прощения? Зачем вам конвертировать даты в другие типы для сравнения? Если даты не имеют компонентов времени, вы можете сделать:

DA.ACCESS_DATE >= CCM.START_DATE AND
DA.ACCESS_DATE < COALESCE(CCM.[END_DATE], '20161001') 

Если даты имеют компоненты времени и вы хотите их игнорировать, вам следует преобразовать их в date, но только для удаления компонента времени.

Я должен отметить, что это может не улучшить производительность. В этой версии есть возможность воспользоваться доступными индексами, если они подходят. Использование индексов ускорило бы запрос.

person Gordon Linoff    schedule 15.02.2017
comment
DA.ACCESS_DATE имеет тип Datetime, а START_DATE и END_DATE — это Date. - person Ankur Jain; 15.02.2017
comment
Нужно ли мне включать индекс в обе таблицы, если да, то какой индекс кластеризован или некластеризован? - person Ankur Jain; 15.02.2017
comment
@АнкурДжейн. . . Если у вас есть вопрос об индексации, задайте другой вопрос и включите запрос (или его упрощенную версию). Но для этого запроса вы должны попробовать индексировать da(access_date) и ccm(start_date, end_date). - person Gordon Linoff; 15.02.2017