前面是常用日期函数总结,后面是一道连续日期的sql题目及其解法套路。

1.当前日期和时间

select current_timestamp
-- 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

吴邪,小三爷,混迹于后台,大数据,人工智能领域的小菜鸟。

更多请关注

大数据开发-Hive-常用日期函数&&日期连续题sql套路的更多相关文章

  1. 大数据:Hive常用参数调优

    1.limit限制调整 一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果. 有一个配置属性可以开启,避免这种情况---对数据源进行抽样 hive.limit.optimize.e ...

  2. FusionInsight大数据开发---Hive应用开发

    Hive应用开发 了解Hive的基本架构原理 掌握JDBC客户端开发流程 了解ODBC客户端的开发流程 了解python客户端的开发流程 了解Hcatalog/webHcat开发接口 掌握Hive开发 ...

  3. 大数据开发——Hive笔记

    写在前面 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.Hive的运行原理- ...

  4. 大数据开发实战:离线大数据处理的主要技术--Hive,概念,SQL,Hive数据库

    1.Hive出现背景 Hive是Facebook开发并贡献给Hadoop开源社区的.它是建立在Hadoop体系架构上的一层SQL抽象,使得数据相关人员使用他们最为熟悉的SQL语言就可以进行海量数据的处 ...

  5. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  6. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  7. 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...

  8. 大数据开发实战:Hive表DDL和DML

    1.Hive 表 DDL 1.1.创建表 Hive中创建表的完整语法如下: CREATE [EXTERNAL] TABLE [IF NOT EXISTS]  table_name [ (col_nam ...

  9. 2019春招——Vivo大数据开发工程师面经

    Vvio总共就一轮技术面+一轮HR面,技术面总体而言,比较宽泛,比较看中基础,面试的全程没有涉及简历上的东西(都准备好跟他扯项目了,感觉是抽取的题库...)具体内容如下: 1.熟悉Hadoop哪些组件 ...

随机推荐

  1. input 与 button 的问题 (空隙/不等高/对不齐)及 解决办法

    1. input 与 button 为什么有空隙? - 要明白为什么,需要了解一下几点基础知识(耐心看完,你会发现竟如此简单)     1. input 与 button 都属于行级块元素,都具有文本 ...

  2. leetcode25word-ladder

    题目描述 给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度: 每一次转换只能改变一个单词 每一个中间词都必须存在单词字典当中 例如: 给定的初始单 ...

  3. LDA与PCA

    参考: https://www.cnblogs.com/pinard/p/6244265.html https://blog.csdn.net/qq_25680531/article/details/ ...

  4. 14 RPC

    14 RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...

  5. openWRT编译报错集锦

    需网络稳定,可正常上梯子. /*ubuntu18编译报错:*/ autoreconf: running: /home/jack/openwrt-sdk/staging_dir/host/bin/aut ...

  6. Java 最佳命名规则记录

    类名:使用双驼峰规则.如 TestService 包名:命名全小写,且使用小写 如使用 web.csvdata.util 而不是 web.csvData.util 或 web.csvdata.util ...

  7. linux_杂记 命令

    1. 查看centos版本号: lsb_release -a 2. 查看mysql服务是否开机启动: http://www.cnblogs.com/panjun-Donet/archive/2010/ ...

  8. TP5 RCE

    Thinkphp5 RCE 复现 环境: win10+wamp+thinkphp5.1.29 下载地址 源码分析 程序首先跳转到 public目录下的index.php,然后执行 thinkphp/l ...

  9. 1. 线性DP 120. 三角形最小路径和

    经典问题: 120. 三角形最小路径和  https://leetcode-cn.com/problems/triangle/ func minimumTotal(triangle [][]int) ...

  10. 年轻人不讲武德来白piao我这个老同志

    朋友们好啊,我是码农小胖哥. 今天有个同学问我在吗,我说什么事? 给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的. 他说了两种选择,一种是用DelayQueue,一种是用消息队列. 他说 ...