常用时间操作函数汇总表格
函数 | 返回值类型 | 函数说明 |
from_unixtime(unix_time [,format]) | string | UNIX时间戳(秒数)转为日期格式字符串,可以设定返回的日期格式[format],不指定时默认为yyyy-MM-dd HH:mm:ss格式 |
unix_timestamp() | bigint | 返回当前时间戳,已被标记弃用 |
unix_timestamp(date [,pattern]) | bigint | 返回指定日期的时间戳,pattern为日期的格式 |
current_timestamp() | bigint | 返回当前时间戳(毫秒,13位) |
to_date(expr) | string | 返回日期时间字段中的日期部分 |
year(param) | int | 返回日期中的年份 |
month(param) | int | 返回日期中的月份 |
day(param) | int | 返回日期中的天数 |
hour(param) | int | 返回日期中的小时 |
minute(param) | int | 返回日期中的分钟 |
second(param) | int | 返回日期中的秒 |
weekofyear(date) | int | 返回日期在当前的周数 |
date_add(start_date, num_days) | string | 返回日期增加num_days天后的日期 |
date_sub(start_date, num_days) | string | 返回日期减去num_days天后的日期 |
datediff(date1, date2) | int | 返回两个日期相差的天数 |
add_months(start_date, num_months[, output_date_format]) | string | 返回start_date增加num_months月之后的日期,可指定输出格式,默认为yyyy-MM-dd |
months_between(date1, date2) | int | 返回两个日期的月份差 |
last_day(date) | string | 返回日期所在月的最后一天日期 |
trunc(date, fmt) | string | 返回截断日期到指定的日期精度,fmt格式仅支持月(MONTH/MON/MM)或者年(YEAR/YYYY/YY) |
next_day(start_date, day_of_week) | string | 返回晚于start_date的下一个星期几的日期(day_of_week可以用两个字母、三个字母或者英文全拼来表示,比如MO、tue、friday) |
注:用 [ ] 括起来的表示是可选参数。
另外,在遇到不知道如何使用的函数时,下面这个命令可以查看函数详细信息,extended关键字展示了函数的使用参考案例:
desc function extended from_unixtime;
演示几个案例
1、获取当前时间戳
select unix_timestamp();
--返回结果:1619404342
unix_timestamp(void)将被弃用,使用unix_timestamp(current_timestamp())替代
select unix_timestamp(current_timestamp());
--返回结果:1619404342
上面默认是获取的10位的秒级时间戳,获取13位的毫秒时间戳方式为:
select cast(cast(current_timestamp() as double)*1000 as bigint);
--返回结果:1619406009385
2、获取当前时间
select from_unixtime(unix_timestamp(current_timestamp()));
--返回结果:2021-04-26 10:37:52
3、日期时间转为时间戳,unix_timestamp(date [,pattern])
select unix_timestamp('2021-04-26 10:37:52');
--返回结果:1619404342
如果入参日期时间格式为’yyyy-MM-dd HH:mm:ss‘,不需要第二个参数pattern;若入参日期时间格式为’yyyy-MM-dd‘,需要指定其对应的pattern格式,例如:
select unix_timestamp('2021-04-26','yyyy-MM-dd');
--返回结果:1619366400
另外需要知道的是,所获取的时间戳为1970-01-01 08:00:00到现今的秒数,验证下这个时间点的时间戳,结果为0:
select unix_timestamp('1970-01-01 08:00:00');
--返回结果:0
4、时间戳转为日期时间,from_unixtime(unix_time [,format])
select from_unixtime(1619404672);
--返回结果:2021-04-26 10:37:52select from_unixtime(1619404672,'yyyyMMdd');
--返回结果:20210426
要注意的是时间戳参数应是10位的秒时间戳。
5、获取N天前的日期
第一印象是使用date_sub(start_date, num_days)这种函数,但是date_sub的局限是参数start_date的格式必须为‘yyyy-MM-dd HH:mm:ss’或者‘yyyy-MM-dd’,我们查看函数详情看下:
select date_sub(current_date(),3);
--返回结果:2021-04-23
select date_sub('20210426',3);
--返回结果:NULL
可见date_sub函数对于不同的格式未必有效。
但是类型“20210426”这种格式是我们常用的,要求3天的日期的话,该如何算呢
select from_unixtime(unix_timestamp('20210426','yyyyMMdd')-3*86400,'yyyyMMdd');
--返回结果:20210423
这种方式不仅入参的时间格式灵活,而且返回值的格式也可根据自身需要设定。
6、获取日期所在月的第一天日期
select trunc('2021-04-26','MM');
--返回结果:2021-04-01
select trunc('2021-04-26','YY');
--返回结果:2021-01-01
7、获取日期所在月的最后一天日期
select last_day('2021-04-26');
--返回结果:2021-04-30
select last_day('2021-02-26');
--返回结果:2021-02-28
8、获取日期所在周的周日的日期
select date_add(next_day('2021-04-26','MO'),-1);
--返回结果:2021-05-02
通过next_day(date,'MO')先算出下周周一的日期,再减去一天就是这周的周日。