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

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

相关文章
|
7月前
|
双11 Python
分享86个节日庆典PPT,总有一款适合您
分享86个节日庆典PPT,总有一款适合您
43 2
分享86个节日庆典PPT,总有一款适合您
|
7月前
|
双11 Python
分享90个节日庆典PPT,总有一款适合您
分享90个节日庆典PPT,总有一款适合您
62 0
|
7月前
|
双11 Python
分享99个节日庆典PPT,总有一款适合您
分享99个节日庆典PPT,总有一款适合您
39 1
|
7月前
|
Python
分享96个节日庆典PPT,总有一款适合您
分享96个节日庆典PPT,总有一款适合您
44 1
|
7月前
|
双11 Python
分享88个节日庆典PPT,总有一款适合您
分享88个节日庆典PPT,总有一款适合您
51 0
|
7月前
|
Python
分享98个节日庆典PPT,总有一款适合您
分享98个节日庆典PPT,总有一款适合您
41 0
|
供应链 前端开发 物联网
面试周连续剧之尘埃落定
通过前面五天的辛勤付出,最终换来了收获的回报,拿到的offer数量还是比较喜人的,虽然自己也不是什么技术大咖,水平也是平平,但是得到了老天的眷顾,让我在找工作的时候没有遇到太多的砍,总体上还是比较顺风顺水的。本文就来分享一下自己如何选择拿到的这些offer,以及最终做出最后的选择的原因。
207 1
面试周连续剧之尘埃落定
|
决策智能
LDU-五一假期专练(5.1)
题目大意:给出n个桶每个桶里面都有若干个小球,三个人做游戏,先手先进行操作,剩下的两个人是一伙的,想让先手输掉,三个人轮流进行游戏,每个人选一个桶取出 > 0 个球,当一个人无法进行操作的时候,就输掉了 后面的两个人想让先手输掉,问先手能否赢得比赛
214 0
LDU-五一假期专练(5.1)
|
新零售 人工智能 大数据
阿里云护航罗振宇2018“时间的朋友”跨年演讲,与千万观众一起跨年
        2018年12月31日20:30分,以“时间的朋友”为主题的罗振宇2018跨年演讲在深圳正式召开,同时通过深圳卫视、优酷等平台进行全球直播。作为年度总结式演讲开创者,2018年跨年演讲与以往跨年演讲一样,依旧保持着超高的人气,据现场统计演讲现场共吸引了7884名观众出席。
3048 0
|
程序员 前端开发
晒晒昨天的节日礼物
昨天1024,各位发的什么?都晒晒吧。我先晒我的。 老板昨天给我发了一个邮件。内容是一周之内学会react并按需求写一个demo。 来看看别人家的公司是怎么过节的: 再来看看拿到融资后的创业公司怎么过的: 某创业公司(以拿到融资) 哎,余不禁想吟诗一首: 写字楼里写字间,写字间里程序员; 程序人员写程序,又拿程序换酒钱。
982 0