大多数SQL中获取当前时间用 now()
函数即可,hive则有所不同。
hive 获取当前时区的UNIX时间戳: unix_timestamp()
SELECT unix_timestamp();
如果想要具体当前时间,则要使用UNIX时间戳转日期函数: from_unixtime()
,返回值: string
SELECT from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss");
不同日期格式示例:
hive> select from_unixtime(1323308943,'yyyy-MM-dd HH:mm:ss');
2011-12-08 09:49:03
hive> select from_unixtime(1323308943,'yyyyMMdd');
20111208
hive> select from_unixtime(1323308943,'yyyy-MM-dd');
2011-12-08
hive> select from_unixtime(1323308943,'yyyy-MM');
2011-12
unix_timestamp
还有其他两种用法,unix_timestamp(string date)
,unix_timestamp(string date, string pattern)
。第一个string date必须是“yyyy-MM-dd HH:mm:ss”格式,否则会出错。
hive> select unix_timestamp('2011-12-07 13:01:03');
1323234063
hive> select unix_timestamp('2011-12-07');
NULL
出现NULL可以考虑使用第二种用法unix_timestamp(string date, string pattern)
:
hive> select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss');
1323234063
hive> select unix_timestamp('2011-12-07 13:05','yyyy-MM-dd HH:mm');
1323234300
hive> select unix_timestamp('2011-12','yyyy-MM');
1322668800
综合使用示例:
select from_unixtime((unix_timestamp('2019-09','yyyy-MM')-1296000),'yyyy-MM');
--1296000(表示半个月15天的总秒数)
OK
2019-08
hive 所有函数都只能识别到 天 的时间一级,不能识别到 月 这么大的时间一级。但是,from_unixtime
和 unix_timestamp
可以识别到 月 一级的时间。
(1) 日期比较 datediff
语法: datediff(string enddate, string startdate)
返回结束日期减去开始日期的天数。
hive> select datediff('2012-12-08','2012-05-09');
213
注意:这个相减日期格式必须是“yyyy-MM-dd”,否则结果为NULL。
SELECT datediff('20200103','20200101');
NULL
可以改为
hive> select datediff(to_date(from_unixtime(unix_timestamp('20200103','yyyyMMdd'))),to_date(from_unixtime(unix_timestamp('20200101','yyyyMMdd'))));
2
(2) 日期增加函数: date_add
语法: date_add(string startdate, int days)
返回值: string
说明: 返回开始日期startdate增加days天后的日期。
hive> select date_add('2019-12-08',10);
2019-12-18
(3) 日期减少函数: date_sub
语法: date_sub (string startdate, int days)
返回值: string
说明: 返回开始日期startdate减少days天后的日期。
hive> select date_sub('2019-12-08',10);
2019-11-28
语法: date_format(date/timestamp/string ts, string fmt)
hive> select date_format('2015-04-08', 'y');
2015
hive> select date_format('2015-04-08', 'yyyy');
2015
hive> select date_format('2015-04-08', 'yyyy-MM');
2015-04
hive> select date_format('2015-04-08 10:10:01', 'yyyy-MM');
2015-04
hive> select date_format('2015-04-08', 'yyyy-MM-dd');
2015-04-08
日期时间转日期函数: to_date
语法: to_date(string timestamp)
hive> select to_date('2011-12-08 10:03:01');
2011-12-08
hive> select to_date('2011-12-08');
2011-12-08
hive> select to_date('2011-12');
NULL
to_date
只能识别到 天 的时间一级。
(1) 日期转年函数: year
语法: year(string date)
返回值: int
说明: 返回日期中的年。
hive> select year('2019-12-08 10:03:01');
2019
hive> select year('2019-12-08');
2019
hive> select year('2019-12');
NULL
year
只能识别到 天 的时间一级。
(2) 日期转月函数: month
语法: month (string date)
返回值: int
说明: 返回日期中的月份。
hive> select month('2019-12-08 10:03:01');
12
hive> select month('2019-08-08');
8
hive> select month('2011-08');
NULL
month
只能识别到 天 的时间一级。
(3) day
只能识别到 天 的时间一级
日期转天函数: day
语法: day (string date)
返回值: int
说明: 返回日期中的天。
hive> select day('2019-12-08 10:03:01');
8
hive> select day('2019-12-24');
24
hive> select day('2019-12');
NULL
(4) hour
、minute
、second
也是类似的用法。
hive> select hour('2019-12-08 10:03:01');
10
hive> select minute('2019-12-08 10:03:01');
3
hive> select second('2011-12-08 10:03:01');
1
(5) 日期转周函数: weekofyear
语法: weekofyear (string date)
返回值: int
说明: 返回日期在当前的周数。
hive> select weekofyear('2011-12-08 10:03:01');
49
在按照周的区间进行统计时,需要识别出周一和周日的日期,此时经常会用到 next_day()
。
语法:next_day(STRING start_date, STRING day of week)
返回当前当前日期对应的下一个周几对应的日期
-- 2020-08-05是周三
SELECT next_day('2020-08-05','MO');
-- 下一个周一对应的日期:2020-08-10
SELECT next_day('2020-08-05','TU');
-- 下一个周二对应的日期:2020-08-11
SELECT next_day('2020-08-05','WE');
-- 下一个周三对应的日期:2020-08-12
SELECT next_day('2020-08-05','TH');
-- 下一个周四对应的日期:2020-08-06,本周四
SELECT next_day('2020-08-05','FR');
-- 下一个周五对应的日期:2020-08-07,本周五
SELECT next_day('2020-08-05','SA');
-- 下一个周六对应的日期:2020-08-08,本周六
SELECT next_day('2020-08-05','SU');
-- 下一个周日对应的日期:2020-08-09,本周日
如果是想获取当前日期所在周的周一对应的日期,则只需先获取当前日期的下周一对应的日期,然后减去7:
SELECT date_add(next_day('2020-08-05','MO'),-7);
同理,想获取当前日期所在周的周日对应的日期,则只需先获取当前日期的下周一对应的日期,然后减去1天:
SELECT date_add(next_day('2020-08-05','MO'),-1);
last_day()
可以将每个月中的日期变成该月的最后一天(28/29/30/31号)
语法:last_day(STRING date)
SELECT last_day('2020-08-05');
-- 2020-08-31
add_months()
:返回加减N个月之后对应的日期
trunc()
:返回当前日期的月初日期
SELECT add_months('2020-08-05',-1);
-- 2020-07-05
SELECT trunc('2020-08-05','MM')
-- 2020-08-01
-- 选取2020-07-05到2020-08-05所有数据
BETWEEN add_months('2020-08-05',-1) AND '2020-08-05'
-- 选取2020-07-01到2020-08-05所有数据
BETWEEN trunc(add_months('2020-08-05',-1),'MM') AND '2020-08-05'
参考链接:
https://cloud.tencent.com/developer/article/1025429