選択した日の iso_week を返す datepart iso_week があります。
SELECT DATEPART(iso_week, getdate())
これは、現在の週のヨーロッパ標準を返します。必ずしも週と同じではありません。
ここにトリッキーな部分があります:
SELECT DATEPART(iso_week, '2011-01-01')
戻り値
52
年と iso_week でグループ化するには、iso_week が同じ年のものではないことを考慮する必要があります。
Iso_week は月曜日から始まり、ほとんどの日が重なる年に属します。したがって、2010 年の 4 日と 2011 年の 3 日は、週が 52 で、すべての日が 2010 年の iso_year に属します。ただし、TSQL には detepart 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 は存在しません):
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