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