需求:hive表中,存放着無法直接識別的字符串格式的時間,如'20170728102031',要計算兩個時間相差的秒數。
解決方法:
一、先將字符串調整為hive可以識別的格式,即將形如'20170728102031' 轉成 '2017-07-28 10:20:31'。 因為hive的 regexp_replace 不支持子語句,沒法一次轉換,只能用萬能的 substr 和拼接函數來寫了
select concat(substr('20170728102031',1,4),'-',substr('20170728102031',5,2),'-',substr('20170728102031',7,2),' ',substr('20170728102031',9,2),':',substr('20170728102031',11,2),':',substr('20170728102031',13,2))
二、用 unix_timestamp 轉成unix時間戳,然后計算兩個日期相差秒數
select unix_timestamp(concat(substr('20170728102031',1,4),'-',substr('20170728102031',5,2),'-',substr('20170728102031',7,2),' ',substr('20170728102031',9,2),':',substr('20170728102031',11,2),':',substr('20170728102031',13,2))) - unix_timestamp(concat(substr('20170728112031',1,4),'-',substr('20170728112031',5,2),'-',substr('20170728112031',7,2),' ',substr('20170728112031',9,2),':',substr('20170728112031',11,2),':',substr('20170728112031',13,2)))
當然了,如果要計算相差分鍾數,直接除以60就ok了。
還有一種方法是分別用 datediff(datetimeA)、hour(datetimeA)-hour(datetimeB) 、minute(datetimeA)-minute(datetimeB)…… 分別計算兩個日期的天數差、小時差、分鍾差等等然后再轉換成同一單位。我覺得這樣太繁瑣。