注册
计算两个日期时间间隔以"x天x时x分x秒"格式显示
专栏/LeeWen的铺子/ 文章详情 /

计算两个日期时间间隔以"x天x时x分x秒"格式显示

LeeWen 2022/01/06 1783 2 0
摘要 使用EXTRACT函数,用法与Oracle基本一致。

创建示例表

/*B表列类型为VARCHAR*/ create table B(DATE1 VARCHAR(20),TIME1 VARCHAR(20),DATE2 VARCHAR(20),TIME2 VARCHAR(20)); insert into B VALUES('2021-01-01','09:12:12','2021-01-02','19:02:01'); insert into B VALUES('2021-01-02','12:12:12','2021-01-05','20:02:01'); insert into B VALUES('2021-01-02','11:12:12','2021-01-04','09:02:01'); insert into B VALUES('2021-01-03','15:12:12','2021-01-06','10:02:01'); insert into B VALUES('2021-01-03','15:12:12','2021-01-06','10:02:01'); insert into B VALUES('2021-01-04','15:00:12','2021-01-06','15:00:12'); insert into B VALUES('2021-01-06','09:00:12','2021-01-06','10:10:15'); COMMIT; /*BB表列类型为DATETIME*/ create table bb (d1 DATETIME,d2 DATETIME); insert into BB VALUES(TO_DATE('2021-01-01 09:12:12','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2021-01-02 19:02:01','yyyy-mm-dd hh24:mi:ss')); insert into BB VALUES(TO_DATE('2021-01-02 12:12:12','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2021-01-05 20:02:01','yyyy-mm-dd hh24:mi:ss')); insert into BB VALUES(TO_DATE('2021-01-02 11:12:12','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2021-01-04 09:02:01','yyyy-mm-dd hh24:mi:ss')); insert into BB VALUES(TO_DATE('2021-01-03 15:12:12','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2021-01-06 19:02:01','yyyy-mm-dd hh24:mi:ss')); insert into BB VALUES(TO_DATE('2021-01-06 09:00:12','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2021-01-06 10:02:01','yyyy-mm-dd hh24:mi:ss')); insert into BB VALUES(TO_DATE('2021-01-04 15:00:12','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2021-01-06 15:02:01','yyyy-mm-dd hh24:mi:ss')); COMMIT;

计算两个日期时间间隔以"x天x时x分x秒"显示

使用EXTRACT函数,用法与Oracle基本一致。
这里使用到的语法:

SELECT EXTRACT(DAY FROM (DATE2 - DATE1) DAY TO SECOND) , EXTRACT(HOUR FROM (DATE2 - DATE1) DAY TO SECOND), EXTRACT(MINUTE FROM (DATE2 - DATE1) DAY TO SECOND), EXTRACT(SECOND FROM (DATE2 - DATE1) DAY TO SECOND) FROM TABLE; /* DATE2、DATE1均为日期时间类型,如果数据类型为VARCHAR需要使用to_date等函数转成日期时间类型 DATE2-DATE1得到的是天数(带小数),需要DAY TO SECOND进行转换后才能识别 */
/*BB表查询*/ select extract(DAY FROM (D2-D1) DAY TO SECOND)||'天'|| extract(HOUR FROM (D2-D1) DAY TO SECOND)||'时'|| extract(MINUTE FROM (D2-D1) DAY TO SECOND)||'分'|| cast(extract(SECOND FROM (D2-D1) DAY TO SECOND)as int)||'秒' AS "时间间隔" ,BB.* from BB; /*B表查询*/ select extract(DAY FROM (TO_DATE(date2||time2,'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1||time1,'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND)||'天'|| extract(HOUR FROM (TO_DATE(date2||time2,'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1||time1,'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND)||'时'|| extract(MINUTE FROM (TO_DATE(date2||time2,'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1||time1,'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND)||'分'|| cast(extract(SECOND FROM (TO_DATE(date2||time2,'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1||time1,'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND)as int)||'秒' AS "时间间隔" ,B.* from B; ---格式化显示 select extract(DAY FROM (TO_DATE(date2 ||time2, 'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1 ||time1, 'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND) ||'天' || extract(HOUR FROM (TO_DATE(date2 ||time2, 'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1 ||time1, 'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND) ||'时' || extract(MINUTE FROM (TO_DATE(date2 ||time2, 'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1 ||time1, 'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND) ||'分' || cast(extract(SECOND FROM (TO_DATE(date2 ||time2, 'YYYY-MM-DDHH24:MI:SS')-TO_DATE(date1 ||time1, 'YYYY-MM-DDHH24:MI:SS')) DAY TO SECOND)as int) ||'秒' AS "时间间隔", B.* from B;

B表查询显示结果:

image-20220106150603023

   需要注意的是,达梦数据库中,EXTRACT函数对于SECOND之外的任何域,函数返回整数,对于SECOND返回小数。所以在最后获取秒的部分会存在小数,返回的类型为DOUBLE类型,DOUBLE类型与字符串拼接时会发生转换(转换为varchar),结果会显示为"4.9E1秒"这样的格式,而不"49秒"。所以需要使用cast将extract返回的值类型转为整数类型然后再拼接,这样会显示为"49秒"。而Oracle中返回的都是number,所以不需要使用cast进行类型转换。

不转换为int,查询结果如下:

image-20220106150704373

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服