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

创建示例表

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值