HIVE 的时间转换函数。
1,select unix_timestamp() 可以得到当前时间的时间戳。
select unix_timestamp(时间格式) 可以得到当前时间的时间戳。两个时间戳进行相减,可以得到两个时间相差的秒数。
SELECT from_unixtime(unix_timestamp()) 可以将时间戳转换成相应的时间格式。
SELECT CURRENT_DATE;可以得到当前的时间。
注:(
时间戳(timestamp):
通常是一个字符序列,唯一地标识某一刻的时间。数字时间戳技术是数字签名技术一种变种 的应用。
定义:
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。)
在大多数的sql中获取当前时间都是用now()函数即可,hive获取当前时间的函数与sql 不一样
hive有一个获得当前时区的UNIX时间戳:unix_timestamp
语法: unix_timestamp()
返回值: bigint
说明: 获得当前时区的UNIX时间戳
有时我们需要的不是时间戳而是具体的当前时间:from_unixtime
语法: from_unixtime(bigint unixtime, string format)
可以将时间戳转化为相应的格式。
SELECT from_unixtime(unix_timestamp());
--2018-02-27 14:51:01
获取当前日期CURRENT_DATE。代码如下:
SELECT CURRENT_DATE;
--2018-02-27
2.日期转换函数
to_date,语法: to_date(string timestamp),返回值为string类型的日期
示例如下:
select to_date(‘2018-02-27 10:03:01’) ;
--2018-02-27
last_day(string date),返回这个月的最后一天的日期。
select last_day(‘2018-02-27 10:03:01’);
--2018-02-28
next_day,返回当前时间的下一个星期几所对应的日期 。如下
select next_day(‘2018-02-27 10:03:01’, ‘TU’);
--2018-03-06
说明,输入日期为2-27,下个星期的周二为03-06,如果想要知道下周一的日期就是MO,周日就是SU,以此类推。
注意:
我跟无数多小白说过,西方国家周日是每周的第一天,所以日历和英语中都是现实周日就是周一。
3 .对比日期函数,经常用于日期之间比较大小,或者计算差值,日期加减。
日期差值:datadiff(结束日期,开始日期),返回结束日期减去开始日期的天数。
日期加减:date_add(时间,增加天数),返回值为时间天+增加天的日期;date_sub(时间,减少天数),返回日期减少天后的日期。
注意如果想知道相差多少个小时又怎么去求那?我们其实稍加改造即可。
hour函数可以获得时间字段的小时数和datediff来获取两个日期相差的天数。然后利用天数*24+hour的差值即为所求,
比如我们求2018-02-27 10:00:00 与 2018-02-25 12:00:00相差多少?
实例代码如下:
select (hour(‘2018-02-27 10:00:00’)-hour(‘2018-02-25 12:00:00’)+(datediff(‘2018-02-27 10:00:00’,‘2018-02-25 12:00:00’))*24) as hour_subValue
--46
补充一个:返回当前时间下再增加num_months个月的日期 add_months(string start_date, int num_months)
上面介绍了hour函数,那么我们也会需要其他的时间提取,不多说直接看代码,年月日时分秒:
select year('2018-02-27 10:00:00'),month('2018-02-27 10:00:00'),day('2018-02-27 10:00:00'),hour('2018-02-27 10:00:00'),minute('2018-02-27 10:00:00'),second('2018-02-27 10:00:00'),weekofyear('2018-02-27 10:00:00');
--2018 2 27 10 0 0 9
补充:quarter,返回当前本年度第几个季度。
DAYOFMONTH(date),它和data()函数都可以返回当前的天数日期。
返回月份日期的当天数,在范围为0〜31。
这下问题来了。获取到了当期的日期怎么获取到上个月的时间那。尝试用下面的函数进行获取;
SELECT SUBSTR(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),30),1,7) AS mo
通过DATE_SUB()函数对获取的时间戳进行操作,对日期进行相减,突然发现要得到上个月的时间,我们的月份的时间都不确定,这里用30天,肯定不行。
有开始发现新的方法:
SELECT SUBSTR(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),DAYOFMONTH(FROM_UNIXTIME(UNIX_TIMESTAMP()))),1,7) AS mo
还是使用的DATE_SUB对日期进行操作,这次是将后面那个参数设置为获取到当前的日期,相减就是上个月最后一天,也是代表上个月。
3 , date_format() 函数与dateformat()函数,是不相同的。
dataformat()函数,可以在不加额外参数的情况下,将"2019-06-07",转换成,“20190607”
即dateformat(“2019-06-07”)
DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。
DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。
可以使用的格式有:
格式 描述
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位