Hive 時間日期處理總結
最近用hive比較多,雖然效率低,但是由於都是T+1的業務模式。所以也就不要求太多了,夠用就行。其中用的吧比較多就是時間了,由於大數據中很多字段都不是標準的時間類型字段,所以期間涉及了很多的時間日期字段的處理,這裏做一個匯總。一遍以後查詢使用。也方便大家學習。
下面列舉幾個用的比較多的情況進行說明:
獲得當前日期的幾種用法:
1.先來一個比較老的,select unix_timestamp() ;
結果如下:
2.通過提示可知該用法已經被放棄了建議采用current_timestamp來替代。查結果如下:
3.如果當前時間為int類型則需要轉義一下比如使用from_unixtime()
SELECTfrom_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 時間日期處理總結