Я собираюсь попробовать это сам, используя подход, описанный в моих комментариях к ответ Манфреда . Идея состоит в том, чтобы найти первый день первой недели ISO указанного года и год после, что позволит включить индексирование between
для входных записей.
Сначала я создаю функцию, которая будет находить первый день первой недели ISO в определенном году:
create function firstIsoDay(@year int) returns datetime as begin
declare @first datetime
select @first = cast(cast(@year as char(4)) as datetime)
select @first = dateadd(ww, datediff(ww, 0, @first), 0)
if datepart(isowk, @first) > 1 set @first = @first + 7
return @first
end
Отказ от ответственности: Эта функция не проверена (на данный момент Sql Server 2008 недоступен).
Фактический запрос данных может быть выполнен с использованием двух вызовов этой функции в фильтре between
:
select datepart(isowk, order_date), count(*) from orders
where order_date between firstIsoDay(@Year) and firstIsoDay(@Year + 1)
group by datepart(isowk, order_date), year(order_date)
order by 1
Помните, что between
является двусторонним включением. Если значения в order_date
содержат укороченные даты (без времени), в конец предложения where
следует добавить -1
. В моем случае, order_date
имеет и дату, и время, поэтому между двумя датами в полночь все будет хорошо.