如何在oracle中以小时和分钟的形式获取开始日期和结束日期之间的日期差异

How to get the date difference between start date and end date in oracle as hours and minutes

我有一个场景,例如,我的 start_date ='12-SEP-2018 00:01:00' 和 End_date ='13-SEP-2018 14:55:00' 。必须在小时和分钟中找出 2 个日期之间的差异,例如“12:20”。这个必须在oracle数据库中实现。我尝试使用以下逻辑:

SELECT 24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours 从 双; 我能够得到时差,但无法得到分钟。

CREATE TABLE table_name ( start_date DATE, end_date DATE );

INSERT INTO table_name VALUES ( TIMESTAMP '2009-07-07 19:30:00', TIMESTAMP '2009-07-07 22:00:00' );

然后您可以从另一个中减去一个并将其转换为 DAY TO SECOND 间隔,然后只是 EXTRACT 时间的组成部分:

SELECT EXTRACT( DAY    FROM difference ) AS days,
       EXTRACT( HOUR   FROM difference ) AS hours,
       EXTRACT( MINUTE FROM difference ) AS minutes,
       EXTRACT( SECOND FROM difference ) AS seconds
FROM   (
  SELECT ( end_date - start_date ) DAY TO SECOND AS difference
  FROM   table_name
);

输出:

DAYS | HOURS | MINUTES | SECONDS
---: | ----: | ------: | ------:
   0 |     2 |      30 |       0

或者您可以使用算术计算值:

SELECT TRUNC( 24 * ( end_date - start_date ) ) AS hours,
       TRUNC( MOD( 24 * 60 * ( end_date - start_date ), 60 ) ) AS minutes,
       ROUND( MOD( 24 * 60 * 60 * ( end_date - start_date ), 60 ) ) AS seconds
FROM   table_name;

输出:

HOURS | MINUTES | SECONDS
----: | ------: | ------:
    2 |      30 |       0

db<>fiddle here

由于您需要一个字符串值,基于您的查询尝试的另一种方法是将两个日期值之间的差异(这是一个数值,它们之间的天数,包括小数天数)添加到任意固定日期;然后将结果转换为字符串:

SELECT to_char(date '0001-01-01'
  + (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')),
  'HH24:MI') as diff
FROM dual;

DIFF 
-----
02:30

如果差异可能超过 24 小时,那么您需要决定如何报告;如果你想把天数作为一个单独的数字,那么你仍然可以使用这种方法,但在格式化为字符串之前需要从差异中减去一个(如果你的固定日期是第一个):

SELECT to_char(date '0001-01-01'
  + (to_date('2009-07-08 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi'))
  - 1,
  'DDD:HH24:MI') as diff
FROM dual;

DIFF     
---------
001:02:30

如果您希望 'hours' 值更高 - 例如这个例子中的'26:30' - 然后它变得更加复杂;我看到@MTO 已经添加了 'arithmetic' 方法,所以我不会重复。但是走 extract() 路线可能会更好(无论如何你应该考虑,因为它更灵活和优雅......)