暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

达梦数据库中计算两个日期时间间隔以"x天x时x分x秒"格式显示

原创 LeeWen2020 2022-03-23
1499

创建示例表

/*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

计算两个日期时间相差多少秒

使用DATEDIFF函数,DATEDIFF函数的作用是返回两个指定日期时间的边界数。

语法:DATEDIFF(datepart,date1,date2),datepart可以是年、月、日、时、分、秒、毫秒等。

DATEDIFF函数的更多使用,具体使用可以参考《DM8 SQL语言使用手册》日期时间函数。

SELECT DATEDIFF(S,D1,D2) as "时间间隔(秒)" ,* FROM BB; SELECT DATEDIFF(S,TO_DATE(date1||time1,'YYYY-MM-DDHH24:MI:SS'),TO_DATE(date2||time2,'YYYY-MM-DDHH24:MI:SS')) as "时间间隔(秒)" ,B.* FROM B; 或者 SELECT DATEDIFF(S, date1||time1, date2||time2) as "时间间隔(秒)", B.* FROM B;
复制

image-20220106151029276

更多资讯可以上达梦技术社区了解:https://eco.dameng.com

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论