天天看點

HIVE小案例:計算字元串格式日期相差天數

戳藍色字關注我們喲!

如果HIVE表中的日期是以字元串形式進行存儲,那如何計算兩個日期相差天數呢?

問題陳述

實際應用中,我們經常用字元串的方式進行日期存儲,字元串雖然可以進行加減操作,但如果我們想得到兩個日期相差幾天,這種方式就無法得到我們想要的結果(如:20200301和20200229相差一天,但直接相減得到的是72)。

下方為某商店使用者最近一次購買日期?

user_id last_dt
A00001 20200229
A00002 20200221
A00003 20200105

如果我們要計算每個使用者上次購買與目前相差幾天,以便對間隔較久的使用者進行精準營銷,該如何計算呢?

HIVESQL代碼

想要解決這個問題,可以通過字元串和時間戳互相轉換函數,結合時間差函數實作。先來看下完整語句,然後再具體講解各函數含義?

datediff(from_unixtime(unix_timestamp('20200131','yyyyMMdd'),'yyyy-MM-dd'),
         from_unixtime(unix_timestamp(last_dt,'yyyyMMdd'),'yyyy-MM-dd'))           

複制

—>unix_timestamp('日期字元串',‘pattern’)

這個函數表示将指定格式的日期轉換為時間戳。unix_timestamp('20200131','yyyyMMdd') 表示将‘20200131’轉換為時間戳,得到結果:1580428800。

—>from_unixtime('時間戳','pattern')

這個函數表示将時間戳轉換為指定格式的日期, from_unixtime(1580428800,'yyyy-MM-dd') 則得到結果 '2020-01-31'

—>datediff('data1','data2')

這個函數表示計算兩個時間的差, datediff('2020-01-31','2020-02-29') 得到結果:1。