前面是經常使用日期函數總結,後面是一道連續日期的sql題目及其解法套路。sql
select current_timestamp -- 2020-12-05 19:16:29.284
SELECT current_date; ## OR SELECT current_date(); -- 2020-12-05
SELECT UNIX_TIMESTAMP(); -- 1524884881
select substr(current_timestamp, 0, 10); -- current_timestamp
select date_sub(current_date, 1); --2020-12-04
select to_date("2017-10-22 10:10:10"); -- 2017-10-22 select date_format("2017-10-22" "yyyy-MM") -- 2017-10
select datediff("2017-10-22", "2017-10-12"); -- 10 select datediff("2017-10-22 10:10:10", "2017-10-12 23:10:10"); -- 10 select datediff("2017-10-22 01:10:10", "2017-10-12 23:10:10"); -- 10
select from_unixtime(cast(substr("1504684212155", 0,10) as int)) dt; -- 2017-09-06 15:50:12
語法: to_date(string timestamp)函數
select to_date(from_unixtime(UNIX_TIMESTAMP())); -- 2018-04-28 select FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd 10:30:00'); -- 2018-04-28 10:30:00 select concat(date_sub(current_date,1),' 20:30:00'); -- 2018-04-27 20:30:00 -- hive version 1.2.0 select date_format(date_sub(current_date,1),'yyyy-MM-dd 20:30:00');
注意:原始日期格式只支持兩種:yyyy-MM-dd yyyy-MM-dd HH:mm:ss
大數據
不然都須要date_format
來轉人工智能
date_add next_day
有一個活躍會員表,天天分區維度是會員id,能夠用device_id來代替,問怎麼計算最近七天連續三天活躍會員數,其中表(dws.dws_member_start_day
)結構以下表(dt是分區,日期格式yyyy-MM-dd,每一個分區有惟一device_id
):spa
device_id string dt string
1.首先思考能夠用到的日期函數datediff, date_sub/date_addunix
2.連續日期,連續問題都會用到一個排名函數,可是排名函數的值是數值,要與日期的連續性作到映射,才方便分組,好比能夠把日期映射到連續數字,或者數字映射到連續日期,實現這兩個的操做就是經過前面的datedff 和 date_sub組合,原理就是日期與日期相減便可獲得連續整數,整數隨便與某個日期作相減便可獲得連續的日期,其中date_sub能夠是反向排序獲得連續日期。code
3.經過連續的排序日期或者排序id相減,而後分組便可解決此類問題orm
SELECT device_id, dt, row_number() over(PARTITION BY device_id ORDER BY dt) ro FROM dws.dws_member_start_day
-- 2.1 序號轉爲連續日期 SELECT device_id, dt, datediff(dt, date_add('2020-07-20', row_number() over(PARTITION BY device_id ORDER BY dt))) gid FROM dws.dws_member_start_day -- 2.2 日期轉爲連續序號 SELECT device_id, dt, (datediff(dt, '2020-07-21') - row_number() over(PARTITION BY device_id ORDER BY dt)) gid FROM dws.dws_member_start_day
SELECT device_id,count(1) FROM (SELECT device_id, dt, datediff(dt, date_add('2020-07-20', row_number() over(PARTITION BY device_id ORDER BY dt))) gid FROM dws.dws_member_start_day WHERE datediff(dt, CURRENT_DATE) BETWEEN -7 AND 7 ) tmp GROUP BY device_id, gid HAVING count(1) < 3
吳邪,小三爺,混跡於後臺,大數據,人工智能領域的小菜鳥。
更多請關注排序