如何从 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;
因为 dato
是 DATE
,所以您会得到天数的差异。如果您想要 INTERVAL
,请将 DATE
转换为 TIMESTAMP
:
max(cast(dato as timestamp)) - min(cast(dato as timestamp)) as total_time
我有一个 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;
因为 dato
是 DATE
,所以您会得到天数的差异。如果您想要 INTERVAL
,请将 DATE
转换为 TIMESTAMP
:
max(cast(dato as timestamp)) - min(cast(dato as timestamp)) as total_time