函数 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
本文介绍了一种特殊的周历计算逻辑,用于确定特定日期属于业务周的哪一周,并考虑了跨年周的情况。针对周日进行了特别处理,确保能正确归类于前一年的最后一周或新年第一周。
2万+

被折叠的 条评论
为什么被折叠?



