Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как посчитать разницу времени между несколькими датами  [new]
Bizkit
Member

Откуда:
Сообщений: 12
Добрый день.

Есть таблица следующего вида

wonum status changedate wostatusid
1014 WAPPR 2021-10-03 15:25:16 181
1014 APPR 2021-10-03 15:25:24 182
1014 INPRG 2021-10-03 15:26:45 183
1014 SLAHOLD 2021-10-03 15:29:33 184
1014 INPRG 2021-10-03 15:29:41 185
1014 SLAHOLD 2021-10-03 15:29:45 186
1014 INPRG 2021-10-03 15:43:40 187
1014 REJECT 2021-10-03 15:43:44 188
1014 CLOSE 2021-10-07 10:00:21 2723

wonum - это номер сущности у которой есть свой жизненный цикл. Данная сущность может сколь угодно раз быть в состоянии SLAHOLD. Из состояния SLAHOLD она может вернутся только в состояние INPRG. В состояние SLAHOLD она может перейти только из состояния INPRG. Подскажите пожалуйста, каким образом можно подсчитать время, которое сущность провела от начала жизненного цикла (статус WAPPR) до конца жизненного цикла (статус CLOSE) исключая то время, которое сущность провела в состоянии SLAHOLD.

Спасибо.
4 ноя 21, 13:42    [22391915]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54798

Как-то так: SUM(CASE WHEN LAG(status) != SLAHOLD THEN changedate-LAG(changedate))

Posted via ActualForum NNTP Server 1.5

4 ноя 21, 13:49    [22391917]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Bizkit
Добрый день.

Есть таблица следующего вида

wonum status changedate wostatusid
1014 WAPPR 2021-10-03 15:25:16 181
1014 APPR 2021-10-03 15:25:24 182
1014 INPRG 2021-10-03 15:26:45 183
1014 SLAHOLD 2021-10-03 15:29:33 184
1014 INPRG 2021-10-03 15:29:41 185
1014 SLAHOLD 2021-10-03 15:29:45 186
1014 INPRG 2021-10-03 15:43:40 187
1014 REJECT 2021-10-03 15:43:44 188
1014 CLOSE 2021-10-07 10:00:21 2723

wonum - это номер сущности у которой есть свой жизненный цикл. Данная сущность может сколь угодно раз быть в состоянии SLAHOLD. Из состояния SLAHOLD она может вернутся только в состояние INPRG. В состояние SLAHOLD она может перейти только из состояния INPRG. Подскажите пожалуйста, каким образом можно подсчитать время, которое сущность провела от начала жизненного цикла (статус WAPPR) до конца жизненного цикла (статус CLOSE) исключая то время, которое сущность провела в состоянии SLAHOLD.

Спасибо.


(CLOSE-WAPPR)-sum(SLAHOLD-lead(changedate)) +-2сек

зы
если не получается, я наберу данные (через with)

.....
stax
4 ноя 21, 15:28    [22391952]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Bizkit
Member

Откуда:
Сообщений: 12
Stax,

Не получилось
4 ноя 21, 16:25    [22391979]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54798

Давай ссылку на https://dbfiddle.uk/?rdbms=oracle_18 с твоей структурой, данными
и неудачной попыткой.

Posted via ActualForum NNTP Server 1.5

4 ноя 21, 16:31    [22391982]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
with t (wonum, status, changedate, wostatusid
) as ( select 1014, 'WAPPR', to_date('2021-10-03 15:25:16','yyyy-mm-dd hh24:mi:ss'), 181
from dual union all select 1014, 'APPR', to_date('2021-10-03 15:25:24','yyyy-mm-dd hh24:mi:ss'), 182
from dual union all select 1014, 'INPRG', to_date('2021-10-03 15:26:45','yyyy-mm-dd hh24:mi:ss'), 183
from dual union all select 1014, 'SLAHOLD', to_date('2021-10-03 15:29:33','yyyy-mm-dd hh24:mi:ss'), 184
from dual union all select 1014, 'INPRG', to_date('2021-10-03 15:29:41','yyyy-mm-dd hh24:mi:ss'), 185
from dual union all select 1014, 'SLAHOLD', to_date('2021-10-03 15:29:45','yyyy-mm-dd hh24:mi:ss'), 186
from dual union all select 1014, 'INPRG', to_date('2021-10-03 15:43:40','yyyy-mm-dd hh24:mi:ss'), 187
from dual union all select 1014, 'REJECT', to_date('2021-10-03 15:43:44','yyyy-mm-dd hh24:mi:ss'), 188
from dual union all select 1014, 'CLOSE', to_date('2021-10-07 10:00:21','yyyy-mm-dd hh24:mi:ss'), 2723
from dual)
, t1 as (
select t.*
     , lead(changedate,1,sysdate) over(partition by wonum order by changedate)-changedate  in_state
  from t
)
select wonum
     , sum(in_state) total_in_days
     , numToDsInterval(sum(in_state),'day') total_interval
     , sysdate at_date
  from t1
 where status <> 'SLAHOLD'
 group by wonum
;

     WONUM TOTAL_IN_DAYS TOTAL_INTERVAL                 AT_DATE
---------- ------------- ------------------------------ --------------------
      1014 32,0435300925 +000000032 01:02:41.000000000  04.11.2021 16:42:00

SQL>  
4 ноя 21, 16:42    [22391985]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
del

Сообщение было отредактировано: 4 ноя 21, 17:35
4 ноя 21, 17:30    [22392018]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Stax
del
не так отнял
le-changedate


Вам уже ответели

но раз обещал, то
with t (wonum, status, changedate, wostatusid
) as ( select 1014, 'WAPPR', to_date('2021-10-03 15:25:16','yyyy-mm-dd hh24:mi:ss'), 181
from dual union all select 1014, 'APPR', to_date('2021-10-03 15:25:24','yyyy-mm-dd hh24:mi:ss'), 182
from dual union all select 1014, 'INPRG', to_date('2021-10-03 15:26:45','yyyy-mm-dd hh24:mi:ss'), 183
from dual union all select 1014, 'SLAHOLD', to_date('2021-10-03 15:29:33','yyyy-mm-dd hh24:mi:ss'), 184
from dual union all select 1014, 'INPRG', to_date('2021-10-03 15:29:41','yyyy-mm-dd hh24:mi:ss'), 185
from dual union all select 1014, 'SLAHOLD', to_date('2021-10-03 15:29:45','yyyy-mm-dd hh24:mi:ss'), 186
from dual union all select 1014, 'INPRG', to_date('2021-10-03 15:43:40','yyyy-mm-dd hh24:mi:ss'), 187
from dual union all select 1014, 'REJECT', to_date('2021-10-03 15:43:44','yyyy-mm-dd hh24:mi:ss'), 188
from dual union all select 1014, 'CLOSE', to_date('2021-10-07 10:00:21','yyyy-mm-dd hh24:mi:ss'), 2723
--
from dual union all select 1015, 'WAPPR', to_date('2021-10-03 15:25:16','yyyy-mm-dd hh24:mi:ss'), 181
from dual union all select 1015, 'APPR', to_date('2021-10-03 15:25:24','yyyy-mm-dd hh24:mi:ss'), 182
from dual union all select 1015, 'INPRG', to_date('2021-10-03 15:26:45','yyyy-mm-dd hh24:mi:ss'), 183
from dual union all select 1015, 'REJECT', to_date('2021-10-03 15:43:44','yyyy-mm-dd hh24:mi:ss'), 188
from dual union all select 1015, 'CLOSE', to_date('2021-10-07 15:25:16','yyyy-mm-dd hh24:mi:ss'), 2723
--
from dual union all select 1016, 'WAPPR', to_date('2021-10-03 15:25:16','yyyy-mm-dd hh24:mi:ss'), 181
from dual union all select 1016, 'APPR', to_date('2021-10-03 15:25:24','yyyy-mm-dd hh24:mi:ss'), 182
from dual union all select 1016, 'INPRG', to_date('2021-10-03 15:26:45','yyyy-mm-dd hh24:mi:ss'), 183
from dual union all select 1016, 'SLAHOLD', to_date('2021-10-03 15:29:45','yyyy-mm-dd hh24:mi:ss'), 186
from dual union all select 1016, 'INPRG', to_date('2021-10-04 15:29:45','yyyy-mm-dd hh24:mi:ss'), 187
from dual union all select 1016, 'REJECT', to_date('2021-10-04 15:43:44','yyyy-mm-dd hh24:mi:ss'), 188
from dual union all select 1016, 'CLOSE', to_date('2021-10-07 15:25:16','yyyy-mm-dd hh24:mi:ss'), 2723
              from dual
)
,tt as (select t.*,lead(changedate) over (partition by wonum order by changedate) le from t)
select wonum, 
          (max(decode(status, 'CLOSE',changedate)) - min(decode(status, 'WAPPR',changedate))) -  --всего
          nvl(sum(decode(status, 'SLAHOLD',le-changedate)),0) --SLAHOLD
          d
from tt
group by wonum
order by 1
SQL> /

     WONUM          D
---------- ----------
      1014 3.76460648
      1015          4
      1016          3

.......
stax
4 ноя 21, 17:48    [22392025]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Bizkit
Member

Откуда:
Сообщений: 12
Stax,

Большое спасибо.
11 ноя 21, 09:01    [22394525]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать разницу времени между несколькими датами  [new]
Bizkit
Member

Откуда:
Сообщений: 12
andrey_anonymous,

Большое спасибо.
11 ноя 21, 09:01    [22394526]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить