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 **形式

  1. select
  2. 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),'小时'),''),
  3. 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),'分钟'),''),
  4. (unix_timestamp(run_end_time)-unix_timestamp(run_start_time))%3600%60,'秒'
  5. ) as run_time
  6. 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秒