解决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如何爬取马蜂窝数据
|
边缘计算 安全 网络协议
关于5G 的十点思考
面向工业互联网和智慧城市的高可靠、低时延等要求,5G以用户服务为本的理念代替了互联网的网络效率优先原则;为适应未来业务的不确定性,5G将从传统电信网的封闭性转为业务开放化和协议互联网化。5G试图兼具互联网与电信网的优势,但在实现上仍面临诸多挑战。文章提出了在网络建设与业务组织上需要重视的十个问题。
学生时代的最后一个新年,请一定要做这五件事
再过一天就要过年了,虽说如今年味越来越淡了,但是毕竟还是一年一度家人团圆的日子,学生党可以说是新春大军里最轻松自在的一群人了,既不用担心春运买不到票,又不用担心七大姑八大姨催婚打探薪水,和长辈们吃个饭还能顺几个红包,何不快哉。
|
新零售 人工智能 大数据
阿里云护航罗振宇2018“时间的朋友”跨年演讲,与千万观众一起跨年
        2018年12月31日20:30分,以“时间的朋友”为主题的罗振宇2018跨年演讲在深圳正式召开,同时通过深圳卫视、优酷等平台进行全球直播。作为年度总结式演讲开创者,2018年跨年演讲与以往跨年演讲一样,依旧保持着超高的人气,据现场统计演讲现场共吸引了7884名观众出席。
3021 0
春节放假
春节休息,2018.2.13-2018.2.25号休息。
1026 0
运气爆棚的我接到一个酒庄的免费送酒电话
本文讲的是运气爆棚的我接到一个酒庄的免费送酒电话,“您好,这里是贵州省茅台镇怀庄酒业,我们在做免费品酒活动,看您需要吗?”这天,在地铁上,小盟接到了这样一个陌生来电。
1936 0
下一篇
无影云桌面