Рассчитать итоговую сумму по столбцу, содержащему разницу в дате в формате ЧЧ: МИ: СС в оракуле
Я должен найти промежуточную сумму за интервал столбца.
SELECT
( ( EXTRACT(DAY FROM intrvl) * 24 ) + ( EXTRACT(HOUR FROM intrvl) ) ) ||':'||
EXTRACT(MINUTE FROM intrvl) ||':'||
EXTRACT(SECOND FROM intrvl) ||':'|| as interval
FROM
(
SELECT
( to_timestamp(TO_CHAR(date_column_name,'dd-mon-rrrr hh:mi:ss') ) ) - ( to_timestamp(TO_CHAR(date_column_name,'dd-mon-rrrr hh:mi:ss') ) ) intrvl
FROM
dual
);
Текущий столбец Interval таблицы имеет следующие данные:
Interval(HH:mi:ss)
0:4:23
696:1:36
696:4:51
8760:1:18
1 ответ
Лучшее, что я могу придумать, это это. Обратите внимание, что interval
Тип данных не принимает форматную модель для отображения - вы не можете принудительно отображать интервал 25 часов как 25:00:00 (хотя вы можете использовать его для ВВОДА интервала). Вместо этого он будет отображаться как 01 01:00:00 (то есть день и час).
with
tbl (interv) as (
select interval '0:4:23' hour(9) to second from dual union all
select interval '696:1:36' hour(9) to second from dual union all
select interval '696:4:51' hour(9) to second from dual union all
select interval '8760:1:18' hour(9) to second from dual
)
select interval '1' day * sum(date '2000-01-01' + interv - date'2000-01-01')
as sum_interv
from tbl;
SUM_INTERV
--------------------
+423 00:12:08.000000
В своей первоначальной попытке вы пытались получить вывод STRING. Я не уверен, что это разумно, но если это то, что вам нужно, вы можете сделать это так:
with
tbl (interv) as (
select interval '0:4:23' hour(9) to second from dual union all
select interval '696:1:36' hour(9) to second from dual union all
select interval '696:4:51' hour(9) to second from dual union all
select interval '8760:1:18' hour(9) to second from dual
)
, prep (sum_interv) as (
select interval '1' day * sum(date '2000-01-01' + interv - date'2000-01-01')
from tbl
)
select to_char( extract(day from sum_interv) * 24
+ extract(hour from sum_interv), 'fm999999999' ) || ':' ||
to_char( extract(minute from sum_interv), 'fm00' ) || ':' ||
to_char( extract(second from sum_interv), 'fm00' ) as sum_interv
from prep
;
SUM_INTERV
------------------
10152:12:08