Hive时间日期函数一文详解+代码实例

简介: Hive时间日期函数一文详解+代码实例

前言


Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。Hive中的表示纯逻辑表,只有表的定义等,即表的元数据(存储于MySQL中)。本质就是Hadoop的目录/文件,这种设计方式实现了元数据与数据存储分离。Hive本身不存储数据,它完全依赖HDFS和MapReduce。


时间在数据库中经常作为时间索引,在数据入库和出库以及更新的时候都需要变化。在一些指标计算或者是提取某段时间的数据时,都会根据数据库中的时间索引数据进行操作。因此很大一部分我们操作数据都得先从时间数据下手,但是想要真正提取到我们想要的时间作为索引,还需要我们掌握许多功能函数方便我们操作,这是一个比较复杂的运用过程。因此特地写下这篇文章,记录一些十分好用常用的处理Hive数据库SQL时间数据的函数,以及实例运用这些函数完成一些复杂查询任务。希望能够帮助到正在看此博文的各位,如果还有什么问题解决不了尽请在评论区提出,博主会一一作答。


一、HiveSQL运行过程


本质上HiveSQL是将sql语句转换为MapReduce程序:


8f3bf973a5984adeada186d6c61fc704.png



这里不展开细化,直接仅需要知道Hive的SQL是和传统MYSQL和SQL server的SQL语法是不同的就够了,他们之间的语法也是存在很多差异。


二、Hive时间函数


1.获取当前时间


共有以下函数可以获取当前时间:


函数 说明 返回
current_date() 获取当前格式化日期 2022-08-08
current_timestamp() 获取当前格式化日期 2022-08-08 11:03:34.946
unix_timestamp() 获取当前unix时间戳 1659927898


1.current_date()


select current_date();


42a8a04d79e942e495499c64562ec786.png


2. current_timestamp()


select current_timestamp();


5122a214e0e34486b18bd69e522c9f41.png

3. unix_timestamp()


select unix_timestamp();



92b8fbfa817d4ceca63226d7f79a06dd.png

2.获取指定时间维度


共有以下函数可以获取指定时间维度:


函数 说明 返回结果

year() 获取日期中的年 2022

quarter() 获取日期中的季度 3

month() 获取日期中的月 8

day() 获取日期中的日 8

hour() 获取日期中的小时 11

minute() 获取日期中的分 32

second() 获取日期中的秒 52

weekofyear() 获取日期在当前年份的第几周 32

dayofweek() 获取日期在当前周的第几天(周日为第一天) 2

last_day() 获取日期当月最后一天 2022-08-31

next_day() 获取当前日期之后的下个星期几的日期 2022-08-15

trunc() 获取日期月初(参数MM),年初日期(参数YY) 2022-08-01,2022-01-01


1. year()


select year(current_date());

e49bd9661aa8473b89058d3db232e031.png


2.quarter()


select year(current_date());

ab9090de9cb34d608551020f2a78c4ab.png

3.month()


select month(current_date());


611aca0528d24937b657ae8608d95f66.png


4.day()


select day(current_date());


13f0dd29ae59473291834b540459ff5d.png

5.hour()


select hour(current_timestamp());


1f1592c6df4d454da479ccd7344026f3.png


6.minute()


select minute(current_timestamp());


b6db195876154f9daf260cff0d2c7f64.png


7.second


select second(current_timestamp());


8e672b51e9bd4964bc77c091bbbf2e6a.png

8.weekofyear()


select weekofyear(current_timestamp());


acdb1040be61432bab3189d62de88f95.png

9. dayofweek()


select dayofweek(current_timestamp());

f98dbd221c394fc083376ea735d620a6.png

10.last_day()


select last_day(current_timestamp());


da3cddb06307482eb0ae2b8f8c6271fb.png


11.next_day()


select next_day(current_date(),'MO');

2058015953634f98907e67e3aa24dbf6.png


12.trunc()


SELECT TRUNC(CURRENT_DATE(),'MM')


4348202f727e4b298a94e8543f5e3389.png

SELECT TRUNC(CURRENT_DATE(),'YY') 


97ceea1d1f3744d3a37a1acd5d94cf7e.png


3.时间格式转换


函数 说明 返回

to_date() 获取日期时间中日期部分数据 2022-08-08

from_unixtime() unix时间戳到转时间格式 yyyy-MM-dd

date_format() 日期、时间戳、字符串类型格式化输出标准时间格式 yyyy-MM-dd

unix_timestamp() 获取当前时间的unix时间戳和日期转UNIX时间戳函数 1659938033

from_utc_timestamp/to_utc_timestamp() utc时间转换 yyyy-MM-dd

to_unix_timestamp() 日期转unix时间戳 1659938033


1.to_date()


select to_date(current_timestamp())


b242586eb4a8462fab7591989e68b46e.png

2. from_unixtime()


select from_unixtime(1659938033,'yyyy-MM-dd')


90d0e243f15a4226906aa9fb72e31707.png

select from_unixtime(1659938033,'yyyyMMdd')

a8ebb9f9472e4f0f8da031fc140df7b5.png


select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:dd:ss');

72dc047f97e04b7bb8e8cdda3ba3a955.png


3.date_format


select date_format(current_timestamp(),'yyyy-MM-dd HH:mm:ss');


8506695c17a24686a7f810733b77df5d.png

select date_format(current_date(),'yyyy-MM-dd');


282c2f9b7afa4d9480d72aa23d0aa0fe.png

select date_format('2022-08-09 12:12:12','yyyy-MM-dd HH:mm:ss'); 

0dee18d9b1aa419b94e02014574327ca.png


4.unix_timestamp


select unix_timestamp();

efd51b586cb34040855615e74cda9452.png


SELECT unix_timestamp(current_timestamp())

5. from_utc_timestamp/to_utc_timestamp


select from_utc_timestamp(current_timestamp(),8);


868d85115df3437d82feebdfea955dec.png

select to_utc_timestamp(current_timestamp(),8);

6ab0f8c31bcd4f74ba75f0e24c6f0614.png


6. to_unix_timestamp


select to_unix_timestamp('2022-08-09 11:10:27','yyyy-MM-dd HH:dd:ss');


f78808d8037644c7b53758ba77a522ee.png


4.时间运算


关于时间运算有很多个不同的方法来实现,自定义函数或者是使用函数拼凑获取自己想要的结果就行了。


这里列举几个常用的时间运算函数:


函数 说明 返回

datediff() 日期比较函数,返回开始日期减去结束日期的天数 前者大于后者,返回值为正,否则,返回值为负。

date_sub() 日期减少函数,返回日期前n天的日期 返回日期前n天的日期

date_add() 日期增加函数,返回日期后n天的日期 返回日期后n天的日期

months_between() 返回两个日期之间包含的月数(结果为double类型) double类型月份数值


1.datediff()


select datediff('2022-08-14','2022-08-04');


54f279ca47494e1f95008c5c6b712ebe.png

select datediff('2022-08-04','2022-08-14');

8fb9345d04cc44848471c78e450222dc.png

2.date_sub()


SELECT date_sub('2022-08-04',10)


beab0d570cba4e518006b6ee3a03576e.png

SELECT date_sub('2022-08-04',-10)


dba47c16f12449dfa6744ba321827138.png


3.date_add()


其实和date_sub可以正负号替换,记住一个就行了:


select DATE_ADD('2022-08-04',10)


69e008bc14854b4ab04b840cd88663dd.png


4.months_between()


select months_between('2022-08-04','2022-08-14')

f2772ee622f54b9e9696f6c13a7e9402.png

目录
相关文章
|
22天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
49 6
基于Python访问Hive的pytest测试代码实现
|
22天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
49 6
|
22天前
|
SQL JavaScript 前端开发
Hive根据用户自定义函数、reflect函数和窗口分析函数
Hive根据用户自定义函数、reflect函数和窗口分析函数
21 6
|
5月前
|
SQL HIVE
hive高频函数(一)
hive高频函数(一)
39 0
|
5月前
|
SQL XML JSON
Hive函数全解——思维导图 + 七种函数类型
Hive函数全解——思维导图 + 七种函数类型
90 2
Hive函数全解——思维导图 + 七种函数类型
|
5月前
|
SQL 分布式计算 HIVE
Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!
在Hive 3.1.2和Spark 3.0.2集群环境中,遇到`dayofweek`函数bug。当`create_date`为字符串类型时,`dayofweek`函数结果错位。修复方法是将`create_date`转换为`date`类型。在Spark SQL中,原始代码能正常运行,未出现此问题。因此建议在Hive中使用转换后的日期类型以避免错误。
|
5月前
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
|
5月前
|
SQL Java 程序员
Hive反射函数的使用-程序员是怎么学UDF函数的
Hive反射函数的使用-程序员是怎么学UDF函数的
35 0
|
5月前
|
SQL HIVE 数据格式
Hive高频函数(二)
Hive高频函数(二)
34 0
|
5月前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
下一篇
无影云桌面