创建示例表
/*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表查询显示结果:
需要注意的是,达梦数据库中,EXTRACT函数对于SECOND之外的任何域,函数返回整数,对于SECOND返回小数。所以在最后获取秒的部分会存在小数,返回的类型为DOUBLE类型,DOUBLE类型与字符串拼接时会发生转换(转换为varchar),结果会显示为"4.9E1秒"这样的格式,而不"49秒"。所以需要使用cast将extract返回的值类型转为整数类型然后再拼接,这样会显示为"49秒"。而Oracle中返回的都是number,所以不需要使用cast进行类型转换。
不转换为int,查询结果如下:
计算两个日期时间相差多少秒
使用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;
更多资讯可以上达梦技术社区了解:https://eco.dameng.com