hive计算周是一年的第几周

函数 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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值