有一个datepart iso_week返回选定日期的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没有找到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
答案 0 :(得分:3)
同一个ISO周的周四将明确地为您提供正确的年份。 this answer可以为您提供如何从给定日期获得正确的星期四的想法。
SELECT
Week = DATEPART(ISOWK, TheThursday),
Year = DATEPART(YEAR, TheThursday),
Count = COUNT(*)
FROM (
SELECT
TheThursday = DATEADD(
DAY,
3 - (DATEPART(DW, col1) + @@DATEFIRST - 2) % 7,
col1
)
FROM @t
) s
GROUP BY
TheThursday
答案 1 :(得分:1)
您可以查看dayofyear
和iso_week
,了解是否需要将年份减去1。
select datepart(iso_week, col1) as [week],
case when datepart(dayofyear, col1) < 7 and
datepart(iso_week, col1) > 51
then year(col1) - 1
else year(col1)
end as [year],
count(*) as [count]
from @t
group by datepart(iso_week, col1),
case when datepart(dayofyear, col1) < 7 and
datepart(iso_week, col1) > 51
then year(col1) - 1
else year(col1)
end
order by [year], [week]
答案 2 :(得分:1)
...编辑
SELECT
IsoWeek = DATEPART(ISO_WEEK, TheDate),
IsoYear = CASE
WHEN
MONTH(TheDate) = 1 AND DATEPART(ISO_WEEK, TheDate) > 51
THEN YEAR(TheDate) - 1
ELSE YEAR(TheDate)
END,
DayCount = COUNT(*)
FROM
@t
GROUP BY
DATEPART(ISO_WEEK, TheDate),
CASE
WHEN MONTH(TheDate) = 1 AND DATEPART(ISO_WEEK, TheDate) > 51
THEN YEAR(TheDate) - 1
ELSE YEAR(TheDate)
END
ORDER BY
IsoYear,
IsoWeek
--IsoWeek IsoYear DayCount
-- 52 2010 6
-- 1 2011 2
答案 3 :(得分:1)
此解决方案还处理前一年开始的一年。
SELECT DATEPART(ISO_WEEK, col1) WEEK,
DATEPART(year , col1 - CAST(col1-.5 as int)%7 + 3) YEAR,
COUNT(*) COUNT
FROM @t
GROUP BY DATEPART(ISO_WEEK, col1),
DATEPART(year , col1 - CAST(col1-.5 as int)%7 + 3)
ORDER BY 2,1