如何从 Oracle 中的日期列计算总时间

How to calculate total time from date column in Oracle

我有一个 table,其中有一些这样的日志。

select table_name,  
    min(to_char(DATO,'dd.mm.yyyy hh24:mi')) as start_time, 
    max(to_char(DATO,'dd.mm.yyyy hh24:mi')) as end_time
from TMP_AUDIT_LOG t
where FLAG='Y'
and TR_MODE='EXPORT'
group by T.TABLE_NAME
order by 2

输出如下

TABLE_NAME  START_TIME          END_TIME
----------  ----------------    ----------------
MAPTEXT     06.11.2020 17:29    06.11.2020 18:12
COMPONENT   06.11.2020 18:12    06.11.2020 19:18
SETTKONT    06.11.2020 19:18    06.11.2020 20:24
ROUTELOG    06.11.2020 20:24    06.11.2020 20:44
CROSSEC     06.11.2020 20:44    06.11.2020 20:49

但我想再增加一列,这样总时间如下所示

TABLE_NAME  START_TIME          END_TIME          TOTAL_TIME
----------  ----------------    ----------------  ----------
MAPTEXT     06.11.2020 17:29    06.11.2020 18:12  43m
COMPONENT   06.11.2020 18:12    06.11.2020 19:18  1h 6m
SETTKONT    06.11.2020 19:18    06.11.2020 20:24  1h 6m
ROUTELOG    06.11.2020 20:24    06.11.2020 20:44  24m
CROSSEC     06.11.2020 20:44    06.11.2020 20:49  5m

我尝试减去两次但没有得到正确的结果。

select table_name, start_time, end_time, 
(to_date(end_time,'dd.mm.yyyy hh24:mi')-to_date(start_time,'dd.mm.yyyy hh24:mi')) as total_time from (
select table_name,  
  min(to_char(DATO,'dd.mm.yyyy hh24:mi')) as start_time, 
  max(to_char(DATO,'dd.mm.yyyy hh24:mi')) as end_time
from TMP_EXPORT_WORKSPACE t
where FLAG='Y'
and TR_MODE='EXPORT'
group by T.TABLE_NAME
order by 2
)
;

我得到的输出低于

TABLE_NAME  START_TIME          END_TIME          TOTAL_TIME
----------  ----------------    ----------------  ----------
MAPTEXT     06.11.2020 17:29    06.11.2020 18:12  0.0298611111111111111111111111111111111111
COMPONENT   06.11.2020 18:12    06.11.2020 19:18  0.0458333333333333333333333333333333333333
SETTKONT    06.11.2020 19:18    06.11.2020 20:24  0.0458333333333333333333333333333333333333
ROUTELOG    06.11.2020 20:24    06.11.2020 20:44  0.0138888888888888888888888888888888888889
CROSSEC     06.11.2020 20:44    06.11.2020 20:49  0.003472222222222222222222222222222222222222

不要将日期转换为字符串。这毫无意义,只会导致意想不到的结果。 dato 列是 DATE 并且每个 table 您想要最小值 dato 和最大值 dato,因此只需使用 MIN(dato)MAX(dato)。那么你想要与众不同。你可以通过一个减去另一个得到差异:

select
  table_name,  
  min(dato) as start_time, 
  max(dato) as end_time,
  max(dato) - min(dato) as total_time
from tmp_audit_log t
where flag = 'Y'
and tr_mode = 'EXPORT'
group by table_name
order by start_time;

因为 datoDATE,所以您会得到天数的差异。如果您想要 INTERVAL,请将 DATE 转换为 TIMESTAMP:

max(cast(dato as timestamp)) - min(cast(dato as timestamp)) as total_time