Имеется datepart iso_week, возвращающая iso_week для выбранного дня.
SELECT DATEPART (iso_week, getdate ())
Это вернет европейский стандарт для текущей недели.Это не обязательно то же самое, что и неделя.
А вот и хитрая часть:
SELECT DATEPART(iso_week, '2011-01-01')
Возвращает
52
, поэтому он относится к прошлому году.по годам и iso_week мне нужно учесть, что iso_week не того же года.
Iso_week начинается в понедельник и относится к году, когда большинство дней перекрываются.Таким образом, 4 дня в 2010 году и 3 дня в 2011 году, неделя составляет 52, и все дни принадлежат iso_year 2010. Однако TSQL не имеет детектора iso_year.
declare @t table(col1 datetime)
insert @t
ALL SELECT '2010-12-28'
UNION ALL SELECT '2010-12-29'
UNION ALL SELECT '2010-12-30'
UNION ALL SELECT '2010-12-31'
UNION ALL SELECT '2011-01-01'
UNION ALL SELECT '2011-01-02'
--UNION ALL SELECT '2011-01-03' Stackexchange is bugged and can't handle this line showing 53
UNION ALL SELECT '2011-01-04'
Мне нужно что-то вроде (iso_year hasnt существует):
SELECT DATEPART(ISO_WEEK, col1) WEEK, DATEPART(iso_YEAR, col1) YEAR, COUNT(*) COUNT
FROM @t
GROUP BY DATEPART(ISO_WEEK, col1), DATEPART(iso_YEAR, col1)
ORDER BY 2,1
Ожидаемый результат
WEEK YEAR COUNT
52 2010 6
1 2011 2