рассчитать промежуточную сумму по столбцу, содержащему разницу в дате в формате ЧЧ: МИ: СС в оракуле - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужно найти промежуточную сумму за интервал столбца.

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(HH:mi:ss)
0:4:23
696:1:36
696:4:51
8760:1:18

1 Ответ

0 голосов
/ 30 ноября 2018

Лучшее, что я могу придумать, это это.Обратите внимание, что тип данных interval не принимает модель формата для отображения - вы не можете принудительно отображать интервал в 25 часов как 25:00:00 (хотя вы можете использовать его для INPUTинтервал).Вместо этого он будет отображаться как 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
...