1 时间计算
1.0 时间字段
字段名 | 格式 |
---|---|
timestamp | yyyy-MM-dd HH:mm:ss |
1.1 时间函数
(1) datediff
功能: | 计算日期差,获得天数【天数 = end_date-start_date】 |
---|---|
形式: | datediff(end_date , start_date) |
输入参数: | yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss |
返回结果: | INT,天数 |
(2)unix_timestamp**
功能: | 将日期转换为时间戳 |
---|---|
形式: | unix_timestamp(‘2020/11/11 22-22-22’ , ‘yyyy/MM/dd HH-mm-ss’) |
unix_timestamp(‘2020_11_11’ , ‘yyyy_MM_dd’) | |
unix_timestamp(‘2020-11-11 22:22:22’) | |
输入参数: | 默认格式为’yyyy-MM-dd HH:mm:ss’ - 如果完全吻合该格式,可以只输入第一个参数; - 如果与默认格式不匹配,需要第二个参数作为格式依据,如果不写第二个参数或两个参数不一致则返回null; - 如果输入unix_timestamp(‘2020-11-11 22’ , ‘yyyy_MM_dd HH’)则认为是2020年11月11日 22时0分0秒对应的时间戳。 |
返回结果: | BIGINT,时间戳 从1970年8点0分0秒算起,单位为秒,早于这个时间为负数,晚于这个时间为1~n位不等的整数,这几年的时间戳基本是10位数。 |
(3)from_unixtime**
功能: | 将时间戳转换为指定格式日期 |
---|---|
形式: | from_unixtime(BIGINT) |
from_unixtime(BIGINT , ‘yyyy/MM-dd HH_mm:ss’) | |
from_unixtime(cast (VARCHAR as BIGINT) , ‘yyyy/MM’) | |
输入参数: | 转化结果的默认格式为’yyyy-MM-dd HH:mm:ss’ 可以通过第二个参数指定转化的格式 |
返回结果: | VARCHAR 如果格式有问题,返回null |
(4)to_date**
功能: | 获取日期中的年月日 |
---|---|
形式: | to_date(‘yyyy-MM-dd HH:mm:ss’) |
to_date(‘yyyy-MM-dd HH’) | |
输入参数: | 默认格式为’yyyy-MM-dd HH:mm:ss’ 可以没有ss、mm:ss、HH:mm:ss,但yyyy-MM-dd缺一不可 |
返回结果: | VARCHAR,年月日,’yyyy-MM-dd’ 如果格式有问题,返回null |
(5)year、month、day、hour、minute、second
功能: | 从日期字符串获取年、月、日、时、分、秒 |
---|---|
形式: | year(‘yyyy-MM-dd HH:mm:ss’) |
year(‘yyyy-MM-dd’) | |
hour(‘yyyy-MM-dd HH:mm:ss’) | |
输入参数: | 当函数为year、month、day时,必须保持’yyyy-MM-dd’完整 当函数为hour、minute、second时,必须保持’yyyy-MM-dd HH:mm:ss’完整 |
返回结果: | VARCHAR, year -> ‘yyyy’ day -> ‘dd’ 当格式错误时返回null |
todo:https://www.cnblogs.com/qi-yuan-008/p/12642224.html
(6)
1.2 典型模版
1.2.1 计算时间的日差
(1) 日期为 yyyy-MM-dd 或 **yyyy-MM-dd HH:mm:ss 形式,计算日差**:select datediff(end_date , start_date)...
select datediff(‘2030-01-01’,’2029-01-01’); select datediff(‘2030-01-01 22:22:22’ , ‘2029-02-02 11:11:11’);
(2)
1.2.2 计算运行时间,返回为【yyyy年MM月dd日 HH小时mm分钟ss秒】
(1) 日期为 **yyyy-MM-dd HH:mm:ss **形式
select
concat( if(cast((unix_timestamp(run_end_time)-unix_timestamp(run_start_time))/3600 as int)>0,concat(cast((unix_timestamp(run_end_time)-unix_timestamp(run_start_time))/3600 as int),'小时'),''),
if(cast((unix_timestamp(run_end_time)-unix_timestamp(run_start_time))%3600/60 as int)>0,concat(cast((unix_timestamp(run_end_time)-unix_timestamp(run_start_time))%3600/60 as int),'分钟'),''),
(unix_timestamp(run_end_time)-unix_timestamp(run_start_time))%3600%60,'秒'
) as run_time
from tb;
如果
run_start_time = ‘2021-01-22 22:47:55’
run_end_time1 = ‘2021-01-22 22:48:22’
run_end_time2 = ‘2021-01-22 22:49:00’
run_end_time3 = ‘2021-01-22 23:55:22’
则:
run_time1 = 27秒
run_time2 = 1分钟5秒
run_time3 = 1小时7分钟27秒