大資料開發-Hive-常用日期函式&&日期連續題sql套路
前面是常用日期函式總結,後面是一道連續日期的sql題目及其解法套路。
1.當前日期和時間
2020-12-05 19:16:29.284
2.獲取當前日期,當前是 2020-12-05
SELECT current_date;
OR
SELECT current_date();
-- 2020-12-05
3.獲取unix系統下的時間戳
SELECT UNIX_TIMESTAMP();
-- 1524884881
4.當前是 2020-12-05
select substr(current_timestamp, 0, 10);
-- current_timestamp
5.當前是 2020-12-05
select date_sub(current_date, 1);
--2020-12-04
6.yyyy-MM-dd HH:MM:ss 擷取日期
select to_date("2017-10-22 10:10:10");
-- 2017-10-22
select date_format("2017-10-22" "yyyy-MM")
-- 2017-10
7.兩個日期之間的天數差
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
8.時間擷取
select from_unixtime(cast(substr("1504684212155", 0,10) as int)) dt;
-- 2017-09-06 15:50:12
9.時間戳轉日期
語法: 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');
10.日期增加
注意:原始日期格式只支援兩種:yyyy-MM-dd yyyy-MM-dd HH:mm:ss
否則都需要date_format
來轉
date_add
next_day
11. 附加題
有一個活躍會員表,每天分割槽維度是會員id,可以用device_id來代替,問怎麼計算最近七天連續三天活躍會員數,其中表(dws.dws_member_start_day
)結構如下表(dt是分割槽,日期格式yyyy-MM-dd,每個分割槽有唯一device_id
):
device_id string
dt string
解法套路
1.首先思考可以用到的日期函式datediff, date_sub/date_add
2.連續日期,連續問題都會用到一個排名函式,但是排名函式的值是數值,要與日期的連續性做到對映,才方便分組,比如可以把日期對映到連續數字,或者數字對映到連續日期,實現這兩個的操作就是通過前面的datedff 和 date_sub組合,原理就是日期與日期相減即可得到連續整數,整數隨便與某個日期做相減即可得到連續的日期,其中date_sub可以是反向排序得到連續日期。
3.通過連續的排序日期或者排序id相減,然後分組即可解決此類問題
## 1.在原表基礎上增加一列排序序號
SELECT device_id,
dt,
row_number() over(PARTITION BY device_id
ORDER BY dt) ro
FROM dws.dws_member_start_day
## 2.將序號轉為連續日期,或者把日期轉為連續數字,後成為gid
### 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
## 3.分組篩選
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
吳邪,小三爺,混跡於後臺,大資料,人工智慧領域的小菜鳥。 更多請關注
相關文章
- SQL SERVER 日期和時間資料型別及函式 (Transact-SQL)SQLServer資料型別函式
- MySQL-日期和資料處理函式MySql函式
- Clickhouse SQL日期處理函式及案例分享SQL函式
- SQLSERVER日期函式(zt)SQLServer函式
- 《MySQL 入門教程》第 16 篇 MySQL 常用函式之日期函式MySql函式
- MYSQL事件使用 日期函式MySql事件函式
- Clickhouse 時間日期函式函式
- Haskell 中的日期函式Haskell函式
- mysql日期函式總結MySql函式
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- Django筆記二十五之資料庫函式之日期函式Django筆記資料庫函式
- excel自動生成連續日期 excel怎麼設定日期遞增Excel
- SPL 的日期時間函式函式
- oracle interval日期函式的bug!Oracle函式
- sql server日期格式 sqlserver的日期格式SQLServer
- oracle 10g函式大全–日期型函式Oracle 10g函式
- SQL Server日期資料型別DATE的使用SQLServer資料型別
- Oracle OCP(03):字元函式、數字函式和日期函式Oracle字元函式
- 日期加一天的函式函式
- MySQL 的日期和時間函式MySql函式
- 資料庫日期資料庫
- Go基礎-時間和日期函式Go函式
- MySQL日期和時間函式彙總MySql函式
- SQL 獲取SQL Server中兩個日期之間的所有日期SQLServer
- SQL SERVER 日期格式化、日期和字串轉換SQLServer字串
- python中關於時間和日期函式的常用計算總結Python函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Mysql日期常用語句MySql
- SQL 獲取SQL Server中日期最近7天之間的所有日期SQLServer
- 【大資料開發】Hive——Hive函式大全大資料Hive函式
- 大資料CHENGDAYE中日期轉換FROM_大資料
- Power BI-DAX公式常用函式套路公式函式
- sqlserver資料庫日期如何格式化-日期轉換字串SQLServer資料庫字串
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- 探索MySQL高階語句(數學函式、聚合函式、字串函式、日期時間函式)MySql函式字串
- 大資料Spark Sql中日期轉換FROM_UNIXTIME和UNIX_TIMESTAMP的使用大資料SparkSQL
- DBA_oracle日期函式-【來自多個專案】Oracle函式
- mysql儲存過程及日期函式實踐MySql儲存過程函式