解决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

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

相关文章
|
C语言 C++
C/C++实现跨年表白烟花
C/C++实现跨年表白烟花
552 0
|
数据可视化 前端开发
带走你的新年愿望,共同开启热力新年
新春送礼,这是技术人开启新年的方式。
带走你的新年愿望,共同开启热力新年
第四天
自己的数据库和网站
380 0
第四天
学生时代的最后一个新年,请一定要做这五件事
再过一天就要过年了,虽说如今年味越来越淡了,但是毕竟还是一年一度家人团圆的日子,学生党可以说是新春大军里最轻松自在的一群人了,既不用担心春运买不到票,又不用担心七大姑八大姨催婚打探薪水,和长辈们吃个饭还能顺几个红包,何不快哉。
|
Java 物联网 C#
2019年的第一场雪来的既猛又烈,突然想分享点东西
清晨起床,震惊了,窗外一片雪白,大雪纷飞,我承认我词穷了,说再多话也描述不了此刻的大好心情。所以,话不多说,先上一张朋友圈的图吧! 趁着这么“好的”天气以及这么好的心情突然想写点东西记录一下自己的2018这一年以及2019年的这一天以及对.NET Core的看法。
1977 0
|
新零售 人工智能 大数据
阿里云护航罗振宇2018“时间的朋友”跨年演讲,与千万观众一起跨年
        2018年12月31日20:30分,以“时间的朋友”为主题的罗振宇2018跨年演讲在深圳正式召开,同时通过深圳卫视、优酷等平台进行全球直播。作为年度总结式演讲开创者,2018年跨年演讲与以往跨年演讲一样,依旧保持着超高的人气,据现场统计演讲现场共吸引了7884名观众出席。
3043 0
|
架构师 Java 程序员
又有程序猿倒下了(华为)!这是有多累啊?再一次输给了生活....
事例一:震惊IT界天才程序员跳楼自杀事件,最杀人的还是人心 2017年9月7日凌晨5点左右,WePhone创始人兼开发者苏享茂,在公司附近的住所处跳楼自杀。
1470 0
八月十九风雨大作
梦觉苏土命方始, 沉月倾守墨清池。 枝花无意涉尘缘, 何故东风侵扰之。 --------张风捷特烈-2017.8.19 八月十九风雨大作
920 0
|
自然语言处理 Java 数据安全/隐私保护
2018-05-10 第四天
一、内存分析(栈) 二、注释:comment 注释的作用:帮助开发人员更好的理解记忆程序的。   java 中支持三种注释: 1:单行注释  //后续的内容都是注释的内容  可以单独占用一行,用来解释说明它下面一行的代码。
1235 0