函数 weekofyear 可以直接计算当前周属于年的第几周
对于跨年周,以当前周所在年天数多的年为准。即一周大于等于4天时间在上一年,则为上一年的最后一周,否则为新年的第一周
查询语句
查询结果
附日历
以上 周 指自然周(周一到周日为一周)
业务需要,我们的周为业务周,周日到周六为一周,判断业务周围年的第几周,周日这天需要特殊处理。
如果是非跨年周,周日直接算作自然周所在周的下一周;
如果是跨年周,周日所在周分两种情况,1跨年周天数在新的一年天数较多,比如2018年的这种,就算做新年的第一周;2如果跨年周天数所在上一年天数较多,比如2021年这种情况,则算在上一年的最后一周
实现逻辑(mm_week是重点逻辑)
select
datekey
,date_cn
,dayofweek
,dayofweek_cn
,week ##自然周int
,year ##当前年int
,month
,day
,quarter
,mm_week_begin_date ##业务周开始时间(周日)
,mm_week_end_date ##业务周结束时间(周六)
,(case
##是周日&&周跨年&&周所在前一年的天数较多,算作前一年的最后一周
when cast(dayofweek as int) = 7 and substr(mm_week_begin_date,1,4) != substr(mm_week_end_date,1,4) and year(date_sub(next_day(date,'MO'),4)) = substr(mm_week_begin_date,1,4) then week + 1
##是周日&&周跨年&&周所在新一年的天数较多(因为 !周所在前一年的天数较多 所以 周所在新一年的天数较多),算作新年的第一周
when cast(dayofweek as int) = 7 and year(date_sub(next_day(date,'MO'),4)) != substr(mm_week_begin_date,1,4) then 1
##是周日 && !周跨年 算作下一周
when cast(dayofweek as int) = 7 and year(date_sub(next_day(date,'MO'),4)) = substr(mm_week_begin_date,1,4) then week + 1
else week
end) as mm_week
,(case
when substr(mm_week_begin_date,1,4) != substr(mm_week_end_date,1,4) and year(date_sub(next_day(date,'MO'),4)) = substr(mm_week_begin_date,1,4) then substr(mm_week_begin_date,1,4)
else year
end) as mm_year
from dim.dim_date
where
datekey between $now.datekey and $endnow.datekey