Мы можем начать с установки первого дня недели в четверг, используя оператор SET DATEFIRST .Это означает, что для дальнейших расчетов потребуется неделя с четверга по среду вместо обычной.
Затем вы можете ограничить свои данные, начиная с первого четверга года, и, наконец, просто вычтите 1 из WEEK
, чтобы получитьжелаемый вывод.
set datefirst 4 --Set Thursday as first day of the week
SELECT MIN(dt) as StartWeek, MAX(dt) as EndWeek, DATENAME(WEEK,dt)-1 as [WEEK]
FROM #tbl
WHERE YEAR(dt) = 2018
AND dt >= (select min(dt) from #tbl where datename(WEEKDAY,dt) = 'Thursday')
GROUP BY DATENAME(WEEk,dt)
Если вы удалите условие AND
из фильтра, вашей первой строкой будет неделя 0, содержащая три дня в году до первого четверга.Даже в этом случае ваша неделя, начинающаяся 4 января 2018 года, все еще имеет номер 1.
ОБНОВЛЕНИЕ: нижеследующее должно быть в состоянии скорректироваться на недели, разделенные на 2 года.
set datefirst 4 --Set Thursday as first day of the week
select *, case when datepart(week,d1) > datepart(week,d2) then datepart(week,d1) else datepart(week,d2)-1 end from
(
select d1, max(d2) d2 from
(select t1.dt d1, t2.dt d2
from #tbl t1
inner join #tbl t2 on datediff(day,t1.dt,t2.dt) between 1 and 6
and t1.dt < t2.dt
and datename(weekday, t1.dt) = 'Thursday') s
group by d1) t
- Один разснова установите начало недели на четверг.
- Далее, получите все четверги в вашем наборе данных и найдите соответствующий конец недели.
- Наконец, добавьте проверку того, находится ли неделя в том же году - если это не так, возьмите номер недели для даты начала предыдущего года.Это даст вам ожидаемую непрерывность.
Я настроил тест здесь: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=75582819ff0defb7366592f4a89e9604