Hive如何判断某一天是星期几


 

在网上找了下,貌似以下这种方法是最靠谱的:

f(t_date)=pmod(datediff(t_date,b_date)-N,7)

这里:pmod和datediff都是hive的内置函数,

t_date是我们需要知道星期几的日期(称为目标日期),

b_date是我们选择的基准日期,N是调整天数(取决于b_date)

 

比如我们想知道2020-01-17是星期几,同时选择2020-01-16作为基准日期,那么判断函数就变成了:

pmod(datediff('2020-01-17','2020-01-16'),7)

查询结果为1,则表示是星期一,2是星期二,……,7是星期日。

虽然非常简单,但是这里还是要把心理路程说一下。

解决思路:

问题是我们要知道2020-01-17是星期几,首先从最简单的方式去推导,然后将公式一般化。

首先我们知道2020-01-16是星期日,那么:

2020-01-17与2020-01-16相差一天,是星期一;

2020-01-18与2020-01-16相差二天,是星期二;

……

2020-01-23与2020-01-16相差7天,是星期日;

然后就是周期性循环:

2020-01-24与2020-01-16相差8天,是星期一;

……

我们发现规律:

datediff(t_date,'2020-01-16')除以7取余后的余数就是星期几。

现在问题来了:

要使用以上这个结果必须满足以下条件:1、目标日期必须大于2020-01-16;2、基准日期必须是星期日。

也就是说我们只能通过以上结论解决“判断2020-01-16以后的日期是星期几”这样的问题,小于2020-01-16的日期就不能判断。

要解除以上限制,我们的基准日期要选的足够小,小到可以满足我们业务上所有业务日期的判断。

比如我们选择了1920-01-04,且也是周日,那么这个日期也可以作为基准日期使用:

pmod(datediff('1920-01-04','1920-01-01'),7)

那为什么最后要选择1920-01-01呢,可能是因为1920-01-01比1920-01-04更加好记忆吧。

 

因此,如果选择的基准日期是星期日,那么:

f(t_date)=pmod(datediff(t_date,b_date),7)

如果选择的基准日期是星期四,显然

f(t_date)=pmod(datediff(t_date,b_date+3),7)=pmod(datediff(t_date,b_date)-3,7)

 

最后我们选择了1920-01-01为基准日期,就有:

pmod(datediff(t_date,'1920-01-01')-3,7)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM