解决weekofyear跨年问题

简介: Hive 中 weekofyear 函数的跨年问题

前言

前段时间,做了一个日期维度表的需求,发现 计算当年第几周 有误,发现 Hiveweekofyear 函数存在跨年问题!

跨年问题

这一周算上一年还是下一年,取决于这一周的大多数日期(4天及以上)在哪一年。算在前一年,就是前一年的最后一周;算在后一年就是后一年的第一周。

比如下面这种情况:

2022年最后6天(>=4天)和2023年第一天在一周内,那么2023-01-01就会算在前一年的最后一周!

SELECT WEEKOFYEAR('2023-01-01'); -- 52

上面的 52, 实际上是2022年的第52周!

但是有个问题:按正常人的逻辑来看,2023-01-01 不应该算到2022年的第52周,而是2023年的第一周,2023-01-02 到 2023-01-08 应该算是2023年的第二周…

SELECT WEEKOFYEAR('2023-01-02'); -- 1

实际通过 WEEKOFYEAR 获取 2023-01-02 是2023年的第一周了,这样就和正常人的逻辑有出入了!

计算当年第几周

select CASE WHEN YEAR(DATE_SUB(NEXT_DAY(curr_date,'monday'),4)) < CAST(SUBSTR(curr_date,1,4) as int) THEN 1
            WHEN YEAR(DATE_SUB(NEXT_DAY(curr_date,'monday'),4)) > CAST(SUBSTR(curr_date,1,4) as int) THEN WEEKOFYEAR(DATE_SUB(TO_DATE(curr_date),4))+1
            ELSE if(WEEKOFYEAR(TO_DATE(concat(SUBSTR(curr_date,1,4),'-01-01')))>1, WEEKOFYEAR(curr_date)+1,WEEKOFYEAR(curr_date)) END AS TH_YEAR_WOM;

curr_date :要计算的某个日期

NEXT_DAY(curr_date,‘monday’):计算curr_date的下一个星期一的日期

YEAR(DATE_SUB(NEXT_DAY(curr_date,‘monday’),4)) :计算curr_date的周数所在年份

  1. 如果 周数所在年份 < 当前年份 ,表示当前年的前几天,属于前一年的最后一周,而我们想要的是当前年的第一周。
  2. 如果 周数所在年份 < 当前年份 ,表示当前年的最后几天,属于后一年的第一周,而我们想要的是当前年的最后一周。
  3. 如果 周数所在年份 = 当前年份 ,表示当前年的中间的日期,假如 当前年的第一天属于前一年的最后一周,那么我们想要的周数 = WEEKOFYEAR(curr_date)+1

以上就是按照我们正常人的逻辑,计算当年第几周!

相关文章
|
数据采集 JavaScript 数据安全/隐私保护
“五一”出游堪比春运
python如何爬取马蜂窝数据
|
人工智能 物联网 计算机视觉
国庆假去哪里玩?我推荐台州府城!
最近几天,同事见面,问的最多的就是:你国庆假去哪里玩儿? 如果你还没有什么计划的话,我有一个推荐:台州府城!
227 13
国庆假去哪里玩?我推荐台州府城!
学生时代的最后一个新年,请一定要做这五件事
再过一天就要过年了,虽说如今年味越来越淡了,但是毕竟还是一年一度家人团圆的日子,学生党可以说是新春大军里最轻松自在的一群人了,既不用担心春运买不到票,又不用担心七大姑八大姨催婚打探薪水,和长辈们吃个饭还能顺几个红包,何不快哉。
|
新零售 人工智能 大数据
阿里云护航罗振宇2018“时间的朋友”跨年演讲,与千万观众一起跨年
        2018年12月31日20:30分,以“时间的朋友”为主题的罗振宇2018跨年演讲在深圳正式召开,同时通过深圳卫视、优酷等平台进行全球直播。作为年度总结式演讲开创者,2018年跨年演讲与以往跨年演讲一样,依旧保持着超高的人气,据现场统计演讲现场共吸引了7884名观众出席。
3000 0
|
机器学习/深度学习 人工智能 TensorFlow
2018 年春节总结
春节即将结束了,复盘一下今年春节的得与失。 作为一名为人父不久的技术工作者,春节真是一个难得的长假,有太多事情要去做。平时加班较多,自然是希望借这个机会多给孩子高质量的陪伴;双方父母都不方便过来照顾孩子,所以娃一直是媳妇一个人带,我也想在假期里能多分担一些她的压力;因为孩子还比较小,老家又在寒冷的东北,最近几年一直没有回家过年,今年春节是娃出生后第一次返乡过年,当然也要多陪陪父母;作为一个自诩的终身学习者,我也给这个难得的长假安排了很多的学习计划,例如学习热门的开源项目,看英文技术书籍,学习英语等。
1056 0
春节放假
春节休息,2018.2.13-2018.2.25号休息。
1017 0