powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Временной интервал
47 сообщений из 47, показаны все 2 страниц
Временной интервал
    #39566456
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток! Нужна помощь, как можно подсчитать временной интервал мужду двумя датами, расчет времени с 9 до 18-00 в минутах без учета выходных дней?
Есть две даты 02.03.2017 17:30:13 и 23.02.2017 23:04:51 результат расчета получается 206 , вот как можно получить такой результат пока не могу понять...
...
Рейтинг: 0 / 0
Временной интервал
    #39566458
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018,

шо, опять?
...
Рейтинг: 0 / 0
Временной интервал
    #39566459
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот запрос который я использую, но получаю результат 3750 вместо 206, вот и не знаю как вычесть выходные дни

with q as (
select
to_date('23.02.2017 23:04:51', 'DD.MM.YYYY HH24:MI:SS') d1,
to_date('02.03.2017 17:30:13', 'DD.MM.YYYY HH24:MI:SS') d2,
9 h1,
18 h2
from dual
)
select
round ((
case
when d1 <= trunc(d1) + h1 / 24 then (h2 - h1) / 24
when d1 >= trunc(d1) + h2 / 24 then 0

else (trunc(d1) + h2 / 24) - d1
end
+
case
when d2 <= trunc(d2) + h1 / 24 then 0
when d2 >= trunc(d2) + h2 / 24 then (h2 - h1) / 24
else d2 - (trunc(d2) + h1 / 24)
end
+
greatest(trunc(d2) - trunc(d1) - 1) * (h2 - h1) / 24
) * 24 *60) hh
from q;
...
Рейтинг: 0 / 0
Временной интервал
    #39566468
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018,
Студентам, желающим помощи

Большие гонки- Макс, прибор?
- 200
- Что 200?
- А что прибор?


подготовьте тестовые данные, напишите что хотите получить, и что Вы написали, правильно оформив исполльзуя ТЭГ SRC
Код: plsql
1.
2.
3.
4.
5.
6.
with t as (select
to_date('02.03.2017 17:30:13','DD.MM.YYYY HH24:MI:SS') D1
,to_date('23.02.2017 23:04:51','DD.MM.YYYY HH24:MI:SS') D2
from dual
)
select D1-D2 from t



P.S. Судя по цифре 206 что-то не так, 5 рабочих дней на 8 часов
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
                                2017

         Jan                    Feb                    Mar
 S  M Tu  W Th  F  S    S  M Tu  W Th  F  S    S  M Tu  W Th  F  S
 1  2  3  4  5  6  7             1  2  3  4             1  2  3  4
 8  9 10 11 12 13 14    5  6  7  8  9 10 11    5  6  7  8  9 10 11
15 16 17 18 19 20 21   12 13 14 15 16 17 18   12 13 14 15 16 17 18
22 23 24 25 26 27 28   19 20 21 22 23 24 25   19 20 21 22 23 24 25
29 30 31               26 27 28               26 27 28 29 30 31

host expr 8 \* 7 \* 60
3360
...
Рейтинг: 0 / 0
Временной интервал
    #39566486
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите что мне необходимо добавить в предоставленый моною скрипт для вычета выходны, чтоб не считалось время выходных дней?
...
Рейтинг: 0 / 0
Временной интервал
    #39566488
vlad2018Подскажите что мне необходимо добавить в предоставленый моною скрипт для вычета выходны, чтоб не считалось время выходных дней?производственный календарь со списком выходных и праздничных дней....
...
Рейтинг: 0 / 0
Временной интервал
    #39566489
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018,
всего лишь выполнить просьбу 20891548
...
Рейтинг: 0 / 0
Временной интервал
    #39566491
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018вот запрос который я использую, но получаю результат 3750 вместо 206, вот и не знаю как вычесть выходные дни

автор без учета выходных дней


???

.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39566497
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чтоб между датами 02.03.2017 17:30:13 и 23.02.2017 23:04:51 мы не считали субботу и воскресенье
...
Рейтинг: 0 / 0
Временной интервал
    #39566520
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018чтоб между датами 02.03.2017 17:30:13 и 23.02.2017 23:04:51 мы не считали субботу и воскресенье
Поиск: Учет праздничных дней
Но даже учет времени без выходных, не поможет получить 206
206 мин / 60 мин - будет чуть больше 3-х часов
...
Рейтинг: 0 / 0
Временной интервал
    #39566536
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как вообще не учитывать выходные дни в расчете?
...
Рейтинг: 0 / 0
Временной интервал
    #39566537
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018а как вообще не учитывать выходные дни в расчете?
Ссылка в 21017772
...
Рейтинг: 0 / 0
Временной интервал
    #39566587
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018,

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

Код: 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.
with t as (
select to_date('02.03.2017 17:30:13','dd.mm.yyyy hh24:mi:ss') d1,
       to_date('23.02.2017 23:04:51','dd.mm.yyyy hh24:mi:ss') d2 from dual
)
,tt as (
select  
 --первый день
 case --з
  when d2<trunc(d2)+09/24 then 9*60 
  when d2>trunc(d2)+18/24 then 0 
  else (d2-trunc(d2))*24*60-9*60
  end d2
,
 --последний день
 case --з
  when d1<trunc(d1)+09/24 then 0
  when d1>trunc(d1)+18/24 then 9*60 
  else (d1-trunc(d1))*24*60-9*60
  end  d1
, --полные дни
((trunc(d1)-trunc(d2))-1)*9*60 d
from t
)
select (d+d1+d2) mi_all from tt

SQL> /

    MI_ALL
----------
3750,21667



.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39568497
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxvlad2018,

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

Код: 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.
with t as (
select to_date('02.03.2017 17:30:13','dd.mm.yyyy hh24:mi:ss') d1,
       to_date('23.02.2017 23:04:51','dd.mm.yyyy hh24:mi:ss') d2 from dual
)
,tt as (
select  
 --первый день
 case --з
  when d2<trunc(d2)+09/24 then 9*60 
  when d2>trunc(d2)+18/24 then 0 
  else (d2-trunc(d2))*24*60-9*60
  end d2
,
 --последний день
 case --з
  when d1<trunc(d1)+09/24 then 0
  when d1>trunc(d1)+18/24 then 9*60 
  else (d1-trunc(d1))*24*60-9*60
  end  d1
, --полные дни
((trunc(d1)-trunc(d2))-1)*9*60 d
from t
)
select (d+d1+d2) mi_all from tt

SQL> /

    MI_ALL
----------
3750,21667



.....
stax

Тут получается расчет времени с учетом выходных дней
...
Рейтинг: 0 / 0
Временной интервал
    #39568684
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018Тут получается расчет времени с учетом выходных дней
без выходных

возьміте маленький диапазон за выходные

....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39569563
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxvlad2018Тут получается расчет времени с учетом выходных дней
без выходных

возьміте маленький диапазон за выходные

....
stax

Если мы берем с 15.02.2017 10:39:06 по 28.02.2017 12:41:31 то должно получится 4982, при выполнении вашего скрипта получается 7239 т.е. при подсчете учитываются выходные
...
Рейтинг: 0 / 0
Временной интервал
    #39569583
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018,

Похоже Вы на разных языках говорите =)

Stax: без учета выходных. Имеет ввиду что запросу не проверяет выходной день или нет.
vlad2018: без учета выходных. Имеете ввиду что запрос должен выбросить выходные дни из расчета.

Я бы Вам порекомендовал ставить задачу точнее, например: исключить из расчета выходные дни

И примеры давать не за пол месяца (никто с калькулятором пересчитывать не будет) ... а за 1-2 дня (включая выходной)
...
Рейтинг: 0 / 0
Временной интервал
    #39569585
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLvlad2018,

Похоже Вы на разных языках говорите =)

Stax: без учета выходных. Имеет ввиду что запросу не проверяет выходной день или нет.
vlad2018: без учета выходных. Имеете ввиду что запрос должен выбросить выходные дни из расчета.

Я бы Вам порекомендовал ставить задачу точнее, например: исключить из расчета выходные дни

И примеры давать не за пол месяца (никто с калькулятором пересчитывать не будет) ... а за 1-2 дня (включая выходной)

Да, возможно мы не поняли друг друга) Вы прави "запрос должен выбросить выходные дни из расчета." Вот и обратился за помощью потому как не знаю как это можно реализовать..((
...
Рейтинг: 0 / 0
Временной интервал
    #39569603
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018,

Тогда встречный вопрос, а какие дни у Вас выходные? что делать с праздниками (они тоже выходные), с переносами выходных дней с последующими отработками (например рабочими субботами)?
...
Рейтинг: 0 / 0
Временной интервал
    #39569606
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLvlad2018,

Тогда встречный вопрос, а какие дни у Вас выходные? что делать с праздниками (они тоже выходные), с переносами выходных дней с последующими отработками (например рабочими субботами)?

Выходные дни только суббота и воскресенье
...
Рейтинг: 0 / 0
Временной интервал
    #39569613
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018MaximaXXLvlad2018,

Тогда встречный вопрос, а какие дни у Вас выходные? что делать с праздниками (они тоже выходные), с переносами выходных дней с последующими отработками (например рабочими субботами)?

Выходные дни только суббота и воскресенье

я спеціально составлял запрос з трех частей
1 первый день
2 последлний день
3 полные дни (без 1,2)


если выходные не могут быть в 1 и 2 то надо ухудчить (учесть субботы и недели)
Код: plsql
1.
2.
3.
4.
, --полные дни
((trunc(d1)-trunc(d2))-1)*9*60 d
from t
) 



.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39569635
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxvlad2018пропущено...


Выходные дни только суббота и воскресенье

я спеціально составлял запрос з трех частей
1 первый день
2 последлний день
3 полные дни (без 1,2)


если выходные не могут быть в 1 и 2 то надо ухудчить (учесть субботы и недели)
Код: plsql
1.
2.
3.
4.
, --полные дни
((trunc(d1)-trunc(d2))-1)*9*60 d
from t
) 




.....
stax


Подскажите пожалуйста, как их учесть?
...
Рейтинг: 0 / 0
Временной интервал
    #39569648
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018

Подскажите пожалуйста, как их учесть?

Да Вам же ПОДСКАЗЫВАЮТ, разбивайте на интервалы, вычисляйте по частям, используйте trunc (почитайте что она может ....)

А у Вас получается подскажите читать как я 6 дней назад Вам задание поставил, а Вы еще ответ не написали.
...
Рейтинг: 0 / 0
Временной интервал
    #39569752
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLvlad2018
Подскажите пожалуйста, как их учесть?

Да Вам же ПОДСКАЗЫВАЮТ, разбивайте на интервалы, вычисляйте по частям, используйте trunc (почитайте что она может ....)

А у Вас получается подскажите читать как я 6 дней назад Вам задание поставил, а Вы еще ответ не написали.
В том то и дело, что не знаю как это сделать....
...
Рейтинг: 0 / 0
Временной интервал
    #39569770
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018,

проверяйте (запутался я)

d_from d_to не выходные


Код: 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.
 with t as (
 select to_date('08.12.2017 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
       ,to_date('12.12.2017 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
 from dual
 )
 ,tt as (
 select
  --первый день
  case --з
   when d_from<trunc(d_from)+09/24 then 9*60
   when d_from>trunc(d_from)+18/24 then 0
   else ((trunc(d_from)+18/24) - d_from)*24*60
   end mi_from
 ,
 --последний день
  case --з
   when d_to<trunc(d_to)+09/24 then 0
   when d_to>trunc(d_to)+18/24 then 9*60 
   else (d_to-trunc(d_to))*24*60-9*60
   end  mi_to 
, 
--полные дни
 (select (sum(decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1))) *9*60 
 from t
 connect by d_from+level<d_to
 ) mi
 ,d_from
 ,d_to
 from t
 )
 select decode(trunc(d_from),trunc(d_to),(d_to-d_from)*24*60,mi+mi_from+mi_to) mi_all
--,mi_from,mi_to,mi  
from tt

SQL> /

    MI_ALL
----------
       620
...
Рейтинг: 0 / 0
Временной интервал
    #39569813
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxvlad2018,

проверяйте (запутался я)

d_from d_to не выходные


Код: plsql
1.
2.
3.
4.
5.
--полные дни
 (select (sum(decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1))) *9*60 
 from t
 connect by d_from+level<d_to
 )



Стас, походу с циклами перемудрил, там и математики должно хватить

Код: plsql
1.
2.
3.
4.
5.
6.
select (((trunc(d_from,'IW')-trunc(d_from)) -- от ПН до d_from (идет с минусом)
       +(to_char(trunc(d_to,'IW'),'IW')-to_char(trunc(d_from,'IW'),'IW'))*5 -- кол-во недель по 5 раб дней
       +(trunc(d_to)-trunc(d_to,'IW'))) -- от ПН до d_to
       -1) --День учтен ранее
       *9*60 -- 9 раб часов в мин 
from t
...
Рейтинг: 0 / 0
Временной интервал
    #39569848
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLСтас, походу с циклами перемудрил, там и математики должно хватить

праздники (в тч а первозванный), тяжело соображаю

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  1   with t as (
  2   select to_date('01.01.2018 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
  3         ,to_date('05.01.2018 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
  4   from dual
  5   )
  6  select (((trunc(d_from,'IW')-trunc(d_from)) -- от ПН до d_from (идет с минусом)
  7         +(to_char(trunc(d_to,'IW'),'IW')-to_char(trunc(d_from,'IW'),'IW'))*5 -- кол-во недель по 5 раб дней
  8         +(trunc(d_to)-trunc(d_to,'IW'))) -- от ПН до d_to
  9         -1) --День учтен ранее
 10          mi -- 9 раб часов в мин
 11* from t
SQL> /

        MI
----------
         3




.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39569852
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
учтите, в Украине 25-12 с 2017-ого уже выходной, а 02-05 с 2018-ого уже не выходной
...
Рейтинг: 0 / 0
Временной интервал
    #39569960
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

Даже лучше так:

Код: plsql
1.
2.
3.
4.
5.
6.
  select (((trunc(d_from,'IW')-trunc(d_from)) -- от ПН до d_from (идет с минусом)
       +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
       +(trunc(d_to)-trunc(d_to,'IW'))) -- от ПН до d_to
       -1) --День учтен ранее
       *9*60 -- 9 раб часов в мин 
from t
...
Рейтинг: 0 / 0
Временной интервал
    #39570138
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLMaximaXXL,

Даже лучше так:

Код: plsql
1.
2.
3.
4.
5.
6.
  select (((trunc(d_from,'IW')-trunc(d_from)) -- от ПН до d_from (идет с минусом)
       +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
       +(trunc(d_to)-trunc(d_to,'IW'))) -- от ПН до d_to
       -1) --День учтен ранее
       *9*60 -- 9 раб часов в мин 
from t



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> ed
Wrote file afiedt.buf

  1   with t as (
  2   select to_date('01.01.2017 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
  3         ,to_date('05.01.2017 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
  4   from dual
  5   )
  6    select (((trunc(d_from,'IW')-trunc(d_from)) -- от ПН до d_from (идет с минусом)
  7         +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
  8         +(trunc(d_to)-trunc(d_to,'IW'))) -- от ПН до d_to
  9         -1) --День учтен ранее
 10         --*9*60 -- 9 раб часов в мин
 11  x
 12* from t
SQL> /

         X
----------
         1

SQL>



....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39570223
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Это из-за того что to_date('01.01.2017 17:00:00','dd.mm.yyyy hh24:mi:ss') - Выходной, а у меня по расчетам пятидневная неделя
Где-то выше было написано что введенные даты не выходные ...
Могу переделать на 7 дневную, но пусть vlad2018 прикладывает знания, тестирует, подгоняет ... и так комментов более чем достаточно.
...
Рейтинг: 0 / 0
Временной интервал
    #39570259
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

обычно выходной от года не зависит
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  1   with t as (
  2   select to_date('01.01.2018 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
  3         ,to_date('05.01.2018 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
  4   from dual
  5   )
  6    select (((trunc(d_from,'IW')-trunc(d_from)) -- от ПН до d_from (идет с минусом)
  7         +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
  8         +(trunc(d_to)-trunc(d_to,'IW'))) -- от ПН до d_to
  9         -1) --День учтен ранее
 10         --*9*60 -- 9 раб часов в мин
 11  x
 12* from t
SQL> /

         X
----------
         3



.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39570361
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxMaximaXXL,

обычно выходной от года не зависит
.....
stax

Да, но тут математическая магия =) (trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5
которая делает из семидневной недели - пятидневную, как итог если дата СБ или ВС то
(trunc(d_from,'IW')-trunc(d_from)) или (trunc(d_to)-trunc(d_to,'IW')) вернет число более 5 или -5 что приведет к потере 1 или 2 дней.
Можно обложить LEAST и GREATEST ... для совсем полного удовлетворения потребностей и универсальности кода
...
Рейтинг: 0 / 0
Временной интервал
    #39570389
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Вот так будет универсально

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
     select GREATEST(
          ((GREATEST(trunc(d_from,'IW')-trunc(d_from),-4) -- от ПН до d_from (идет с минусом)
          +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
          +LEAST(trunc(d_to)-trunc(d_to,'IW'),4)) -- от ПН до d_to
          -1) --День учтен ранее
          ,0)
          --*9*60 -- 9 раб часов в мин
   x
  from t
...
Рейтинг: 0 / 0
Временной интервал
    #39570405
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

Код: 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.
  1  with t as (
  2   select to_date('01.01.2013 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
  3         ,to_date('05.01.2013 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to  from dual
  4  union all
  5   select to_date('01.01.2014 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
  6         ,to_date('05.01.2014 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to  from dual
  7   )
  8   select
  9  d_from,to_char(d_from,'day') d,
 10  GREATEST(
 11            ((GREATEST(trunc(d_from,'IW')-trunc(d_from),-4) -- от ПН до d_from (идет с минусом)
 12            +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
 13            +LEAST(trunc(d_to)-trunc(d_to,'IW'),4)) -- от ПН до d_to
 14            -1) --День учтен ранее
 15            ,0)
 16            --*9*60 -- 9 раб часов в мин
 17     x
 18*   from t
SQL> /

D_FROM   D                  X
-------- --------- ----------
01.01.13 вівторок           2
01.01.14 середа             1



.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39570438
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Между вт и пт (2013) - один день, а между ср и пт (2014) - два

Или надо чтоб учитывался один из пограичных дней? типа 2 и 3 соответственно?
...
Рейтинг: 0 / 0
Временной интервал
    #39570441
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

Блин, перепутал ...


Между вт и пт (2013) - два деня, а между ср и пт (2014) - один

Или надо чтоб учитывался один из пограичных дней? типа 3 и 2 соответственно?
...
Рейтинг: 0 / 0
Временной интервал
    #39570449
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLStax,

Между вт и пт (2013) - один день


01.01.13 вівторок 2
почему один?
три
02-среда
03-четверг
04-пятница

.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39570457
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Ну я писал под кусок где вт и пт були обработаны ранее, посему был 1
Если переводить с учетом вт и пт (оба пограничных дня) то это будет так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  with t as (
   select to_date('01.01.2013 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
         ,to_date('05.01.2013 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to  from dual
  union all
   select to_date('01.01.2014 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
         ,to_date('05.01.2014 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to  from dual
   )
   
        select --GREATEST((
          ((GREATEST(trunc(d_from,'IW')-trunc(d_from),-4) -- от ПН до d_from (идет с минусом)
          +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
          +LEAST(trunc(d_to)-trunc(d_to,'IW'),4)) -- от ПН до d_to
          +1) -- с учетом обоих пограничных дней
          --,0)
          --*9*60 -- 9 раб часов в мин
   x
  from t


Но в таком случае с 01.01 по 01.01 будет 1 день

Ну и убирая +1, будет с учетом одного пограничного дня

Тут все зависит как мы расчитываем пограничные дни
...
Рейтинг: 0 / 0
Временной интервал
    #39570464
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

что-то я запинаться начал, а тут править нельзя:

Stax01.01.13 вівторок 2
между вт и пт я делал 2 рабочих дня, потому как вт (расчитана отдельно) + ср,чт(2 раб дня по 9 часов) + пт (расчитана отдельно) - в таком случае есть GREATEST(... -1, 0).

если надо 3
Stax01.01.13 вівторок 2
почему один?
три
02-среда
03-четверг
04-пятница


то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  with t as (
   select to_date('01.01.2013 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
         ,to_date('05.01.2013 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to  from dual
  union all
   select to_date('01.01.2014 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
         ,to_date('05.01.2014 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to  from dual
   )
   
        select 
          (GREATEST(trunc(d_from,'IW')-trunc(d_from),-4) -- от ПН до d_from (идет с минусом)
          +(trunc(d_to,'IW')-trunc(d_from,'IW'))/7*5 -- кол-во недель по 5 раб дней
          +LEAST(trunc(d_to)-trunc(d_to,'IW'),4)) -- от ПН до d_to
          --*9*60 -- 9 раб часов в мин
   x
  from t
...
Рейтинг: 0 / 0
Временной интервал
    #39572212
vlad2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxvlad2018,

проверяйте (запутался я)

d_from d_to не выходные


Код: 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.
 with t as (
 select to_date('08.12.2017 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
       ,to_date('12.12.2017 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
 from dual
 )
 ,tt as (
 select
  --первый день
  case --з
   when d_from<trunc(d_from)+09/24 then 9*60
   when d_from>trunc(d_from)+18/24 then 0
   else ((trunc(d_from)+18/24) - d_from)*24*60
   end mi_from
 ,
 --последний день
  case --з
   when d_to<trunc(d_to)+09/24 then 0
   when d_to>trunc(d_to)+18/24 then 9*60 
   else (d_to-trunc(d_to))*24*60-9*60
   end  mi_to 
, 
--полные дни
 (select (sum(decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1))) *9*60 
 from t
 connect by d_from+level<d_to
 ) mi
 ,d_from
 ,d_to
 from t
 )
 select decode(trunc(d_from),trunc(d_to),(d_to-d_from)*24*60,mi+mi_from+mi_to) mi_all
--,mi_from,mi_to,mi  
from tt

SQL> /

    MI_ALL
----------
       620




Подсчет выходит за рамки установленого ограничения, предположим взять 21.02.2017 16:53:37 и 21.02.2017 19:08:56 то должен быть результат 66 а получается 135
...
Рейтинг: 0 / 0
Временной интервал
    #39572219
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018Staxvlad2018,

проверяйте (запутался я)

d_from d_to не выходные


Код: 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.
 with t as (
 select to_date('08.12.2017 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
       ,to_date('12.12.2017 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
 from dual
 )
 ,tt as (
 select
  --первый день
  case --з
   when d_from<trunc(d_from)+09/24 then 9*60
   when d_from>trunc(d_from)+18/24 then 0
   else ((trunc(d_from)+18/24) - d_from)*24*60
   end mi_from
 ,
 --последний день
  case --з
   when d_to<trunc(d_to)+09/24 then 0
   when d_to>trunc(d_to)+18/24 then 9*60 
   else (d_to-trunc(d_to))*24*60-9*60
   end  mi_to 
, 
--полные дни
 (select (sum(decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1))) *9*60 
 from t
 connect by d_from+level<d_to
 ) mi
 ,d_from
 ,d_to
 from t
 )
 select decode(trunc(d_from),trunc(d_to),(d_to-d_from)*24*60,mi+mi_from+mi_to) mi_all
--,mi_from,mi_to,mi  
from tt

SQL> /

    MI_ALL
----------
       620




Подсчет выходит за рамки установленого ограничения, предположим взять 21.02.2017 16:53:37 и 21.02.2017 19:08:56 то должен быть результат 66 а получается 135что предлагаешь?
...
Рейтинг: 0 / 0
Временной интервал
    #39572225
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad2018Подсчет выходит за рамки установленого ограничения, предположим взять 21.02.2017 16:53:37 и 21.02.2017 19:08:56 то должен быть результат 66 а получается 135

извените, был напуган (неправ)

наверное еще ошибки есть,
я хотел показать как БЫ я брался за задачку (разложил БЫ ее на кусочки)

Код: 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.
with t as (
-- select to_date('08.12.2017 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
--       ,to_date('12.12.2017 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
-- from dual
 select to_date('21.02.2017 16:53:37','dd.mm.yyyy hh24:mi:ss') d_from
       ,to_date('21.02.2017 19:08:56','dd.mm.yyyy hh24:mi:ss') d_to
 from dual
 )
 ,tt as (
 select
  --первый день
  case --з
   when d_from<trunc(d_from)+09/24 then 9*60
   when d_from>trunc(d_from)+18/24 then 0
   else ((trunc(d_from)+18/24) - d_from)*24*60
   end mi_from
 ,
 --последний день
  case --з
   when d_to<trunc(d_to)+09/24 then 0
   when d_to>trunc(d_to)+18/24 then 9*60 
   else (d_to-trunc(d_to))*24*60-9*60
   end  mi_to 
, 
--полные дни
 (select (sum(decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1))) *9*60 
 from t
 connect by d_from+level<d_to
 ) mi
 ,d_from
 ,d_to
 from t
 )
 select 
   decode(trunc(d_from),trunc(d_to)
          ,(least(d_to,trunc(d_to)+18/24)-greatest(d_from,trunc(d_from)+09/24))*24*60
          ,mi+mi_from+mi_to) mi_all
--,mi_from,mi_to,mi  
from tt
/

SQL> /

    MI_ALL
----------
66,3833333




решения Максима возможно луче

зы
я генерил в цикле (select * from calendar) с расчета что мож выходные придется брать из календаря

.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39572233
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Код: 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.
with t as (
-- select to_date('08.12.2017 17:00:00','dd.mm.yyyy hh24:mi:ss') d_from
--       ,to_date('12.12.2017 09:20:00','dd.mm.yyyy hh24:mi:ss') d_to
-- from dual
 select to_date('21.02.2017 19:00:37','dd.mm.yyyy hh24:mi:ss') d_from
       ,to_date('21.02.2017 19:08:56','dd.mm.yyyy hh24:mi:ss') d_to
 from dual
 )
 ,tt as (
 select
  --первый день
  case --з
   when d_from<trunc(d_from)+09/24 then 9*60
   when d_from>trunc(d_from)+18/24 then 0
   else ((trunc(d_from)+18/24) - d_from)*24*60
   end mi_from
 ,
 --последний день
  case --з
   when d_to<trunc(d_to)+09/24 then 0
   when d_to>trunc(d_to)+18/24 then 9*60 
   else (d_to-trunc(d_to))*24*60-9*60
   end  mi_to 
, 
--полные дни
 (select (sum(decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1))) *9*60 
 from t
 connect by d_from+level<d_to
 ) mi
 ,d_from
 ,d_to
 from t
 )
 select 
   decode(trunc(d_from),trunc(d_to)
          ,greatest((least(d_to,trunc(d_to)+18/24)-greatest(d_from,trunc(d_from)+09/24))*24*60,0)
          ,mi+mi_from+mi_to) mi_all
--,mi_from,mi_to,mi  
from tt

SQL> /

    MI_ALL
----------
         0



куда я спешу

надо на празники взять паузу

......
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39572238
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Я такой финт
Код: plsql
1.
decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1)


пользую только для получения номера дня недели

А в нашем случае и такого хватит:
Код: plsql
1.
decode(to_char(d_from+level,'DY','NLS_DATE_LANGUAGE = ENGLISH'), 'SUN',0, 'SAT',0,1) 
...
Рейтинг: 0 / 0
Временной интервал
    #39572247
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLStax,

Я такой финт
Код: plsql
1.
decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1)


пользую только для получения номера дня недели

А в нашем случае и такого хватит:
Код: plsql
1.
decode(to_char(d_from+level,'DY','NLS_DATE_LANGUAGE = ENGLISH'), 'SUN',0, 'SAT',0,1) 



да не вопрос, набирать лень да и с англиским (и не только) туго, путаю ети 'SUN', 'SAT'

задачка на внимательность, надо акуратно обработать даты
наверняка решалась
+ можно еще и перерыв на обед

.....
stax
...
Рейтинг: 0 / 0
Временной интервал
    #39572443
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLЯ такой финт
Код: plsql
1.
decode(mod(to_char(d_from+level,'j'),7),5,0,6,0,1)



пользую только для получения номера дня недели

А в нашем случае и такого хватит:
Код: plsql
1.
decode(to_char(d_from+level,'DY','NLS_DATE_LANGUAGE = ENGLISH'), 'SUN',0, 'SAT',0,1) 

Перебор.
Код: plsql
1.
case when trunc(d_from+level) - trunc(d_from+level, 'iw') > 4 then 0 else 1 end
...
Рейтинг: 0 / 0
47 сообщений из 47, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Временной интервал
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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