1. 程式人生 > >Hive 時間日期處理總結

Hive 時間日期處理總結

log 時間 code times 相差 由於 cnblogs diff 增加

最近用hive比較多,雖然效率低,但是由於都是T+1的業務模式。所以也就不要求太多了,夠用就行。其中用的吧比較多就是時間了,由於大數據中很多字段都不是標準的時間類型字段,所以期間涉及了很多的時間日期字段的處理,這裏做一個匯總。一遍以後查詢使用。也方便大家學習。

下面列舉幾個用的比較多的情況進行說明:

獲得當前日期的幾種用法:

1.先來一個比較老的,select unix_timestamp() ;

結果如下:

技術分享圖片

2.通過提示可知該用法已經被放棄了建議采用current_timestamp來替代。查結果如下:

技術分享圖片

3.如果當前時間為int類型則需要轉義一下比如使用from_unixtime()

SELECT
from_unixtime(unix_timestamp()); --2018-02-27 14:51:01

4.獲取當前日期CURRENT_DATE。代碼如下:

SELECT CURRENT_DATE--2018-02-27

有關日期的函數:

1.對比日期函數,經常用於日期之間比較大小,或者計算差值,日期加減。

日期差值:datadiff(結束日期,開始日期),返回結束日期減去開始日期的天數。

日期加減:date_add(時間,增加天數),返回值為時間天+增加天的日期;date_sub(時間,減少天數),返回日期減少天後的日期。

執行情況如圖所示:

技術分享圖片

  註意如果想知道相差多少個小時又怎麽去求那?我們其實稍加改造即可。

  hour函數可以獲得時間字段的小時數和datediff來獲取兩個日期相差的天數。然後利用天數*24+hour的差值即為所求,

  比如我們求2018-02-27 10:00:00 與 2018-02-25 12:00:00相差多少?

 實例代碼如下:
select (hour(2018-02-27 10:00:00)-hour(2018-02-25 12:00:00)+(datediff(2018-02-27 10:00:00,2018-02-25 12:00:00))*24) as hour_subValue

--46 

  補充一個:返回當前時間下再增加num_months個月的日期 add_months(string start_date, int num_months)

2.上面介紹了hour函數,那麽我們也會需要其他的時間提取,不多說直接看代碼,年月日時分秒:
select year(2018-02-27 10:00:00),month(2018-02-27 10:00:00),day(2018-02-27 10:00:00),hour(2018-02-27 10:00:00),minute(2018-02-27 10:00:00),second(2018-02-27 10:00:00),weekofyear(2018-02-27 10:00:00); 

--2018    2    27    10    0    0    9

  補充:quarter,返回當前本年度第幾個季度。

3.日期轉換函數
to_date,語法: to_date(string timestamp),返回值為string類型的日期
示例如下:
select to_date(2018-02-27 10:03:01) ;

--2018-02-27
last_day(string date),返回這個月的最後一天的日期
select  last_day(2018-02-27 10:03:01);
--2018-02-28

next_day返回當前時間的下一個星期幾所對應的日期 。如下

select next_day(2018-02-27 10:03:01, TU);

--2018-03-06

  說明,輸入日期為2-27,下個星期的周二為03-06,如果想要知道下周一的日期就是MO,周日就是SU,以此類推。

註意:

我跟無數多小白說過,西方國家周日是每周的第一天,所以日歷和英語中都是現實周日再是周一,所以上面的下周日是3-4。註意嘍!

總結

    以上是我平時經常用的一些日期相關的處理和函數,比較方便,想不起來就過來掃一眼。畢竟hive用的比較少,相對於關系型數據庫的t-sql函數和方法還是比較low的,畢竟是個轉義工具。
目前主流還是hivesql,不過慢慢的都在想sparksql之類技術的轉移了。以後有新的日期函數我會繼續想本文中進行匯總,方便大家查詢。

Hive 時間日期處理總結