在网上找了下,貌似以下这种方法是最靠谱的:
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)