Да, в какой день начинается неделя? Воскресенье или понедельник?
datepart (dw, date) возвращает день недели (от 1 до 7), но «[t] число, полученное из datepart дня недели, зависит от значения, установленного SET DATEFIRST, который устанавливает первый день недели . "
Но все вернется правильно, если ваша база данных настроена правильно.
ОК, если возвращается 1, мы в первый день или, в более общем случае, первый день -
1 - datepart (dw, date) дней до нашей даты
Если он возвращает 7, мы находимся в последний день недели или, в более общем случае, последний день -
7 - datepart (dw, date) дней после нашей даты
Мы используем dateadd (dd, n, date), чтобы получить дату n дней от нашей даты, поэтому:
select
date_column,
datepart(wk, date_column ) as week_number,
dateadd( dd, 1 - datepart( dw, date_column ),date_column ) as week_start,
dateadd( dd, 7 - datepart( dw, date_column ), date_column ) as week_end
from table ;
дает нам то, что нам нужно.
Обратите внимание, что первый день первой недели годовой ночи будет в предыдущем календарном году, потому что по определению начинается неделя (воскресенье или понедельник или как вы ее задали), но год может начинаться в любой день недели. Точно так же последний день последней недели года может быть в следующем календарном году.