在網上找了下,貌似以下這種方法是最靠譜的:
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)