Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени) / 16 сообщений из 16, страница 1 из 1
15.03.2019, 16:57
    #39786871
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
Всем, добрый день.

Подскажите, реально ли в oracle посчитать время между датой поступления заявки и датой ее закрытия, при этом не учитываем выходные и праздники и ночное время, берем только рабочее, если заявка пришла 15.03.2019 20:00, а завершили ее 16.03.2019 8:00, при условии, что сотрудники работают с 7:00 до 21:00. В данном примере время составило 2 часа.

Календарь с выходными и праздниками есть.

Пока что все это выгружается в access и там считается
...
Рейтинг: 0 / 0
15.03.2019, 17:08
    #39786882
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
...
Рейтинг: 0 / 0
15.03.2019, 17:09
    #39786883
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
antonkashin,
...
Рейтинг: 0 / 0
15.03.2019, 17:11
    #39786887
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
ОЙ (рука дрогнула)


если есть календар, то почему бы не посчитать

надо акуратненько расписать кобинации начало/конец/выходной

....
stax
...
Рейтинг: 0 / 0
18.03.2019, 08:45
    #39787534
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
Stax,

Первый и последний день у меня есть представление как посчитать, а на счет полных дней и куда календарь прикрутить че то не выходит
...
Рейтинг: 0 / 0
18.03.2019, 10:38
    #39787586
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
antonkashinStax,

Первый и последний день у меня есть представление как посчитать, а на счет полных дней и куда календарь прикрутить че то не выходит

первый и последний день считем отдельно (имхо их посчитать сложнее)
тогда полные дни (без первого и последнего)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
with t as (
select 200 tn, to_date('14/03/19 09:30','dd.mm.rr hh24:mi') w_from,to_date('18/03/19 18:00','dd.mm.rr hh24:mi') w_to from dual union all
select 200 tn, to_date('14/03/19 06:30','dd.mm.rr hh24:mi') w_from,to_date('14/03/19 12:00','dd.mm.rr hh24:mi') w_to from dual union all
select 200 tn, to_date('16/03/19 06:30','dd.mm.rr hh24:mi') w_from,to_date('24/03/19 22:30','dd.mm.rr hh24:mi') w_to from dual 
)
,calendar as(
select date '2019-03-10' d,1 f from dual union all
select date '2019-03-11' d,1 f from dual union all
select date '2019-03-12' d,1 f from dual union all
select date '2019-03-13' d,1 f from dual union all
select date '2019-03-14' d,1 f from dual union all
select date '2019-03-15' d,1 f from dual union all
select date '2019-03-16' d,0 f from dual union all
select date '2019-03-17' d,0 f from dual union all
select date '2019-03-18' d,1 f from dual union all
select date '2019-03-19' d,1 f from dual union all
select date '2019-03-20' d,1 f from dual union all
select date '2019-03-21' d,1 f from dual union all
select date '2019-03-22' d,1 f from dual union all
select date '2019-03-23' d,0 f from dual union all
select date '2019-03-24' d,0 f from dual union all
select date '2019-03-25' d,1 f from dual )
select 
 t.*
,greatest(
  trunc(w_to)-trunc(w_from)-1 -- всего днив
  -(select count(*) cc from calendar c where f=0 and c.d between trunc(w_from)+1 and trunc(w_to)-1) --к-во выходных
,0)
--(select count(*) cc from calendar c where f=1 and c.d between trunc(w_from)+1 and trunc(w_to)-1) --влоб
 d_work
from t
SQL> /

        TN W_FROM   W_TO         D_WORK
---------- -------- -------- ----------
       200 14.03.19 18.03.19          1
       200 14.03.19 14.03.19          0
       200 16.03.19 24.03.19          5



.....
stax
...
Рейтинг: 0 / 0
18.03.2019, 11:12
    #39787617
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
Stax, ты гений.


Спасибо большое! Во всем разобрался
...
Рейтинг: 0 / 0
18.03.2019, 14:18
    #39787778
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
Stax, начал тестировать на своей таблице и сразу выдает ошибку SQL Error: ORA-01427: подзапрос одиночной строки возвращает более одной строки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
drop table test_work;
create table test_work as
with --t as (select t1.*
--from SAF_SMS t1
-- select to_date('04.03.2019 21:30:00','dd.mm.yyyy hh24:mi:ss') start_d
--       ,to_date('08.03.2019 06:30:00','dd.mm.yyyy hh24:mi:ss') finish_d
-- from dual
-- )
/* ,*/ tt as(
 select 
 case 
  when start_dt<trunc(start_dt)+7/24 and 
  (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(start_dt))=0 then 14/24
  when start_dt>trunc(start_dt)+21/24 or 
  (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(start_dt))>0 then 0
  else trunc(start_dt)+21/24-start_dt
  end mi_start
  ,
 case
  when end_dt <trunc(end_dt)+7/24 or 
  (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(end_dt))>0 then 0
  when end_dt>trunc(end_dt)+21/24 
  and (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(end_dt))=0 then 14/24
  else (end_dt-(trunc(end_dt)+17/24))
  end mi_finish
  ,
 (select 
    greatest(
      trunc(end_dt)-trunc(start_dt)-1
      -(select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
        and pc.full_date between trunc(start_dt)+1 and trunc(end_dt)-1 ),0)*(14/24) mi
  from SAF_SMS
  )mi_all
  , t1.*
  from SAF_SMS t1)
   
 select tt.*,
    decode (trunc(start_dt), trunc(end_dt)
             , (least(end_dt,trunc(end_dt)+21/24)-greatest(start_dt, trunc(start_dt)+7/24))
             ,mi_all+mi_start+mi_finish) work_time
 from tt;
...
Рейтинг: 0 / 0
18.03.2019, 14:59
    #39787831
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
antonkashinтестировать на своей таблицеНа своем запросе.
Не нужно всуе наводить тень на гений Stax.
...
Рейтинг: 0 / 0
18.03.2019, 15:09
    #39787837
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
antonkashin,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
-- (select 
    greatest(
      trunc(end_dt)-trunc(start_dt)-1
      -(select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
        and pc.full_date between trunc(start_dt)+1 and trunc(end_dt)-1 ),0)*(14/24) 
--  from SAF_SMS
--  )
mi_all



ps
если в календаре есть рабочие дни то проще, хотя хз
Код: plsql
1.
2.
       (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR<>'Y'
        and pc.full_date between trunc(start_dt)+1 and trunc(end_dt)-1 )*(14/24) 



.....
stax
...
Рейтинг: 0 / 0
18.03.2019, 16:34
    #39787910
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
Stax, спасибо большое!!
...
Рейтинг: 0 / 0
18.03.2019, 17:34
    #39787968
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
antonkashin,

главное сдесь акуратненько все выверить

авторПервый и последний день у меня есть представление как посчитать


проверте напр для
Код: plsql
1.
2.
 select to_date('15.03.2019 08:00:00','dd.mm.yyyy hh24:mi:ss') start_dt
       ,to_date('19.03.2019 08:00:00','dd.mm.yyyy hh24:mi:ss') end_dt


пусть 16,17 выходной

я так понимаю, ето 28 часов

....
stax
...
Рейтинг: 0 / 0
19.03.2019, 08:18
    #39788155
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
Stax, да все правильно, получается 28 часов. Проверил всевозможные комбинации, вроде, считает корректно. Спасибо еще раз.
...
Рейтинг: 0 / 0
19.03.2019, 09:13
    #39788176
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
antonkashinStax, да все правильно, получается 28 часов. Проверил всевозможные комбинации, вроде, считает корректно. Спасибо еще раз.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
with SAF_SMS as (
 select to_date('15.03.2019 08:00:00','dd.mm.yyyy hh24:mi:ss') start_dt
       ,to_date('19.03.2019 08:00:00','dd.mm.yyyy hh24:mi:ss') end_dt
 from dual)
,PROIZVOD_CALENDAR as (
select date '2019-03-15' full_date,'N' HOLIDAY_INDICATOR  from dual union all
select date '2019-03-16' d,'Y' f from dual union all
select date '2019-03-17' d,'Y' f from dual union all
select date '2019-03-18' d,'N' f from dual union all
select date '2019-03-19' d,'N' f from dual union all
select date '2019-03-20' d,'N' f from dual
)
,tt as(
 select
 case
  when start_dt<trunc(start_dt)+7/24 and
  (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(start_dt))=0 then 14/24
  when start_dt>trunc(start_dt)+21/24 or
  (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(start_dt))>0 then 0
  else trunc(start_dt)+21/24-start_dt
  end mi_start
  ,
 case
  when end_dt <trunc(end_dt)+7/24 or
  (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(end_dt))>0 then 0
  when end_dt>trunc(end_dt)+21/24
  and (select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
    and pc.full_date= trunc(end_dt))=0 then 14/24
  else (end_dt-(trunc(end_dt)+17/24))
  end mi_finish
  ,
    greatest(
      trunc(end_dt)-trunc(start_dt)-1
      -(select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y'
        and pc.full_date between trunc(start_dt)+1 and trunc(end_dt)-1 ),0)*(14/24)
  mi_all
  , t1.*
  from SAF_SMS t1)
 select tt.*,
    decode (trunc(start_dt), trunc(end_dt)
             , (least(end_dt,trunc(end_dt)+21/24)-greatest(start_dt, trunc(start_dt)+7/24))
             ,mi_all+mi_start+mi_finish) work_time
,28/24
 from tt
/
 48  /

  MI_START  MI_FINISH     MI_ALL START_DT END_DT    WORK_TIME      28/24
---------- ---------- ---------- -------- -------- ---------- ----------
,541666667      -,375 ,583333333 15.03.19 19.03.19        ,75 1,16666667



.....
stax
...
Рейтинг: 0 / 0
19.03.2019, 09:22
    #39788182
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
antonkashin,

else (end_dt-(trunc(end_dt)+ 17 /24))

....
stax
...
Рейтинг: 0 / 0
19.03.2019, 10:38
    #39788230
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени)
Stax, прошу прощенья. В моем запросе все уже поправлено(единица как-то затесалась). else (end_dt-(trunc(end_dt)+7/24))
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Расчет времени выполнения заявки без учета выходных и праздников(учет только раб времени) / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]