powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Исключение выходные
32 сообщений из 32, показаны все 2 страниц
Исключение выходные
    #36641924
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывожу в запросе дату-время. Могу я в этом же запросе вывести дату-время на 3 дня больше, которая исключит суботу и воскресение?
спасибо
...
Рейтинг: 0 / 0
Исключение выходные
    #36641927
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по-русски? По любому ответ - можно. Теперь дело за вопросом.
...
Рейтинг: 0 / 0
Исключение выходные
    #36641938
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaRo,

в одном запросе хочу прибавить к дате 3 дня, но если внутрь этих трех дней попадают выходные то увеличить еще на количество выходных, т.е. 3+количество выходных.
выходные это СБ ВС
...
Рейтинг: 0 / 0
Исключение выходные
    #36641955
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
царевич,

0. По-тупому
Код: plaintext
case when to_number(to_char(dt,'d')) <= 5  then dt+ 3  else dt+to_number(to_char(dt,'d'))- 2  end 
1. Создать таблицу календарь и отметить в ней выходные.
...
Рейтинг: 0 / 0
Исключение выходные
    #36641988
Dmitry Ermolchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
царевич,

Код: plaintext
select decode (to_char(sysdate,'d'), 6 ,sysdate+ 5 , 7 ,sysdate+ 4 , sysdate+ 3 ) from dual
...
Рейтинг: 0 / 0
Исключение выходные
    #36641989
Dmitry Ermolchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
царевич,

Это при условии, что ваш Оракл начинает неделю с воскресенья
...
Рейтинг: 0 / 0
Исключение выходные
    #36661294
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему то не работает. Подставил в оба предложенных варианта(они ниже) 30 мая, так как раз выходные впереди. В результат в обоих случаях 30.05.2010. А это ВОСКРЕСЕНИЕ:(
Есть идеи? К изменениям настроек оракла у меня доступпа нет. Хорошо б найти вариант без измненения настроек.
Спасибо

select decode (to_char(to_date('27.05.2010','dd.mm.yyyy'),'d'),6,to_date('27.05.2010','dd.mm.yyyy')+5,7,to_date('27.05.2010','dd.mm.yyyy')+4, to_date('27.05.2010','dd.mm.yyyy')+3) from dual

select case when to_number(to_char(to_date('27.05.2010','dd.mm.yyyy'),'d')) <=5 then to_date('27.05.2010','dd.mm.yyyy')+3 else to_date('27.05.2010','dd.mm.yyyy')+to_number(to_char(to_date('27.05.2010','dd.mm.yyyy'),'d'))-2 end from dual
...
Рейтинг: 0 / 0
Исключение выходные
    #36661323
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а резельтат должен быть 01.06.2010
...
Рейтинг: 0 / 0
Исключение выходные
    #36661325
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ой, ошибся, в оба предложенных решения податвил дату 27 мая
...
Рейтинг: 0 / 0
Исключение выходные
    #36661355
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
царевичПочему то не работает to_char(<date>,\'d\')RTFM NLS_TERRITORY (FAQ) , STFF Вопрос про даты. Как получить ближайшее прошедшее воскресенье?
Код: plaintext
greatest(d, trunc(d+ 2 , \'iw\'))
...
Рейтинг: 0 / 0
Исключение выходные
    #36661816
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И все такие как мне прибавить 3 рабочих дня(с учетом выходных) одним запросом?
спасибо
...
Рейтинг: 0 / 0
Исключение выходные
    #36662144
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Умнее того что ниже ничего пока не придумал
Если у кого есть вариант покрасивее, подскажите, буду рад. спасибо

select decode (to_char(to_date('31.05.2010','dd.mm.yyyy'),'d'),
6,to_date('31.05.2010','dd.mm.yyyy')+5,
7,to_date('31.05.2010','dd.mm.yyyy')+4,
3,to_date('31.05.2010','dd.mm.yyyy')+5,
4,to_date('310.05.2010','dd.mm.yyyy')+5,
5,to_date('31.05.2010','dd.mm.yyyy')+5,
to_date('31.05.2010','dd.mm.yyyy')+3) from dual
...
Рейтинг: 0 / 0
Исключение выходные
    #36662217
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
царевич,

Elic почти 4 часа назад привел красивое решение.
Покури еще раз это решение.
...
Рейтинг: 0 / 0
Исключение выходные
    #36662226
царевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey.L,

я его к своей ситуации не смог применить
...
Рейтинг: 0 / 0
Исключение выходные
    #36662298
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
царевичя его к своей ситуации не смог применитьС арифметикой проблемы?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as (
   select trunc(sysdate)+level d from dual connect by level< 10 
),
s as (
   select level n from dual connect by level <  10 
),
r as (
   select n, d, greatest(d+n, trunc(d+n+ 2 , 'iw')) dn
   from t cross join s
)
select *
from r pivot (
   max(to_char(dn,'dd day')) wn for n in ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )
) 
order by  1 
;
...
Рейтинг: 0 / 0
Исключение выходные
    #36662322
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey.LElic почти 4 часа назад привел красивое решение.Если бы автор яснее спрашивал...
Код: plaintext
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.
with t as
( select trunc(sysdate+level) as wd from dual
    where trunc(sysdate+level) - trunc(sysdate+level, 'iw') <  5 
    connect by level <=  20 
), n as (select  3  as n from dual)
select to_char(wd, 'dd.mm.yyyy dy', 'nls_date_language=russian') "wd",
       to_char(
         trunc(wd, 'iw') + trunc((wd - trunc(wd, 'iw') + n) /  5 ) *  7  + mod((wd - trunc(wd, 'iw') + n),  5 )
       , '"+ '||n||' =" dd.mm.yyyy dy', 'nls_date_language=russian'
       ) as "+ n = wd+n"
  from t, n;

wd            + n = wd+n
------------- -------------------
 02 . 06 . 2010  ср +  3  =  07 . 06 . 2010  пн
 03 . 06 . 2010  чт +  3  =  08 . 06 . 2010  вт
 04 . 06 . 2010  пт +  3  =  09 . 06 . 2010  ср
 07 . 06 . 2010  пн +  3  =  10 . 06 . 2010  чт
 08 . 06 . 2010  вт +  3  =  11 . 06 . 2010  пт
 09 . 06 . 2010  ср +  3  =  14 . 06 . 2010  пн
 10 . 06 . 2010  чт +  3  =  15 . 06 . 2010  вт
 11 . 06 . 2010  пт +  3  =  16 . 06 . 2010  ср
 14 . 06 . 2010  пн +  3  =  17 . 06 . 2010  чт
 15 . 06 . 2010  вт +  3  =  18 . 06 . 2010  пт
 16 . 06 . 2010  ср +  3  =  21 . 06 . 2010  пн
 17 . 06 . 2010  чт +  3  =  22 . 06 . 2010  вт
 18 . 06 . 2010  пт +  3  =  23 . 06 . 2010  ср
 21 . 06 . 2010  пн +  3  =  24 . 06 . 2010  чт
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Исключение выходные
    #39899463
karbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Задача: исключить не только выходные, но и праздники, которые хранятся в отдельной таблице holiday. Пока на ум пришла идея через рекурсивный with, но вдруг кто элегантнее решение знает.

Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
with dt as
(
   select to_date('07.12.2019', 'dd.mm.yyyy') as d from dual
),
nd as
( 
   select 13 as n from dual 
),
holiday(hd) as
(
   select to_date('25.12.2019', 'dd.mm.yyyy') from dual
   union all 
   select to_date('26.12.2019', 'dd.mm.yyyy') from dual
),
all_date(d, is_bd, bd_run) as 
(
  SELECT d,
         is_bd,
         is_bd as db_run
    FROM (
           select dt.d+1 as d, 
                  case
                     when h.hd is not null or (1 + trunc(d) - trunc(d, 'IW')) IN (6,7) then 
                        0
                     else
                        1
                  end as is_bd
             from dt,
                  holiday h
            where trunc(dt.d+1) = h.hd(+)
         )
   union all
  select d+1, 
         case
            when h.hd is not null or (1 + trunc(d+1) - trunc(d+1, 'IW')) IN (6,7) then 
               0
            else
               1
         end as is_bd,
         bd_run +
         case
            when h.hd is not null or (1 + trunc(d+1) - trunc(d+1, 'IW')) IN (6,7) then 
               0
            else
               1
         end as bd_run
    from all_date,
         holiday h,
         nd
   where trunc(d+1) = h.hd(+)
     and bd_run +
         case
            when h.hd is not null or (1 + trunc(d+1) - trunc(d+1, 'IW')) IN (6,7) then 
               0
            else
               1
         end <= n
)
select max(d) 
  from all_date
 where is_bd = 1;



Код: plsql
1.
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production



Заранее спасибо.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899519
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karbka,

запиши в холодей еще и выходные и переносы к праздникам
а еще лучше сделай календарь - сколько часов в какой день по какому графику
...
Рейтинг: 0 / 0
Исключение выходные
    #39899549
karbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,

Holiday это только праздники, пользователь вносит через интерфейс. Календарь можно, да, но интересен вариант без него.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899553
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karbka
andreymx,

Holiday это только праздники, пользователь вносит через интерфейс. Календарь можно, да, но интересен вариант без него.
интересен, но в общем случае бесполезен
...
Рейтинг: 0 / 0
Исключение выходные
    #39899560
karbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,

На текущий момент имеется pl/sql функция, которая рассчитывает рабочий день, исключая только выходные аналогично решению от Elic. За UI отвечаю не я, на изменение этой части ресурсы никто не выделит, к сожалению. Поэтому думала выкрутиться на бекэнде, создав перегруженную функцию, которая бы исключала праздники тоже. Может, добавлю выходные в holiday с отдельным флагом. Подумаю.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899570
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karbka,

Разный график работы в филиалах и часовые пояса? Работа с разными клиентами по разному графику?

Поинтересуйся, не будет ли задач расчета чего либо по рабочему времени, лучше сразу сделать производственный календарь, чем потом городить аццкий хардкод.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899579
karbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iOracleDev,

Не, не связано с графиками работы, asset servicing: перенос дедлайнов на нужно количество рабочих дней вперед/назад.

PS. Почему так реализовали и почему до сих пор нет функции, учитывающей и bank holiday, не знаю. Есть отдельная функция, которая проверяет конкретный день праздник он или нет, но в вычислениях она не используется, только выходные исключаются, предполагая что в неделе всегда 5 рабочих дней.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899632
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karbka
Календарь можно, да, но интересен вариант без него.


Код: 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.
54.
55.
56.
57.
58.
59.
60.
undefine workdays
with test_dates as (
                    select  date '2019-11-30' + level curr_date
                      from  dual
                      connect by level <= 14
                   ),
        holiday as (
                    select date '2019-12-25' hd from dual union all
                    select date '2019-12-26' hd from dual
                   ),
 not_a_holiday as (
                    select  trunc(sysdate,'yy') + level - 1 dt
                      from  dual
                      connect by trunc(sysdate,'yy') + level - 1 < date '2020-01-01'
                   minus
                    select  *
                      from  holiday
                  ),
      workdays as (
                   select  row_number() over(order by dt) rn,
                           dt workday
                     from  not_a_holiday
                     where dt - trunc(dt,'iw') <= 4
                  )
select  to_char(curr_date,'fmmm/dd/yyyy, Day') current_date,
        (
         select  to_char(workday,'fmmm/dd/yyyy, Day')
           from  workdays
           where connect_by_isleaf = 1
           start with workday = curr_date - least(0,curr_date - trunc(curr_date + 2,'iw'))
           connect by rn = prior rn + 1
                  and level <= &&workdays + 1
        )  current_date_plus_n_workdays
  from  test_dates
  order by curr_date
/
Enter value for workdays: 10
old  31:                   and level <= &&workdays + 1
new  31:                   and level <= 10 + 1

CURRENT_DATE          CURRENT_DATE_PLUS_N_WORKDAYS
--------------------- ----------------------------
12/1/2019, Sunday     12/16/2019, Monday
12/2/2019, Monday     12/16/2019, Monday
12/3/2019, Tuesday    12/17/2019, Tuesday
12/4/2019, Wednesday  12/18/2019, Wednesday
12/5/2019, Thursday   12/19/2019, Thursday
12/6/2019, Friday     12/20/2019, Friday
12/7/2019, Saturday   12/23/2019, Monday
12/8/2019, Sunday     12/23/2019, Monday
12/9/2019, Monday     12/23/2019, Monday
12/10/2019, Tuesday   12/24/2019, Tuesday
12/11/2019, Wednesday 12/27/2019, Friday
12/12/2019, Thursday  12/30/2019, Monday
12/13/2019, Friday    12/31/2019, Tuesday
12/14/2019, Saturday  12/31/2019, Tuesday

14 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899645
karbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Компактно, спасибо! Единственное, в not_a_holiday старт, наверное, нужен от начальной даты curr_date, не начала текущего года и ограничивать чем-нибудь типа add_months(curr_date, 6)...
...
Рейтинг: 0 / 0
Исключение выходные
    #39899649
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через ф-цию:

Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
create or replace
  function next_workday(
                        p_offset number,
                        p_date   date := trunc(sysdate)
                       )                      
    return date
    is
        v_res_date date;
    begin
        with not_a_holiday as (
                                select  p_date + level - 1 dt
                                  from  dual
                                  connect by p_date + level - 1 <= add_months(p_date,12) -- измени если нужно больше чем на год вперед.
                               minus
                                select  *
                                  from  holiday
                              ),
                  workdays as (
                               select  row_number() over(order by dt) rn,
                                       dt workday
                                 from  not_a_holiday
                                 where dt - trunc(dt,'iw') <= 4
                              )
        select  workday
          into  v_res_date
          from  workdays
          where connect_by_isleaf = 1
          start with workday = p_date - least(0,p_date - trunc(p_date + 2,'iw'))
          connect by rn = prior rn + 1
                 and level <= p_offset + 1;
        return v_res_date;
end;
/
with test_dates as (
                    select  date '2019-11-30' + level curr_date
                      from  dual
                      connect by level <= 13
                   )
select  to_char(curr_date,'mm/dd/yyyy, fmDay') current_date,
        to_char(next_workday(10,curr_date),'mm/dd/yyyy, fmDay') current_date_plus_10_workdays
  from  test_dates
  order by curr_date
/

CURRENT_DATE          CURRENT_DATE_PLUS_10_WORKDAYS
--------------------- ------------------------------
12/01/2019, Sunday    12/16/2019, Monday
12/02/2019, Monday    12/16/2019, Monday
12/03/2019, Tuesday   12/17/2019, Tuesday
12/04/2019, Wednesday 12/18/2019, Wednesday
12/05/2019, Thursday  12/19/2019, Thursday
12/06/2019, Friday    12/20/2019, Friday
12/07/2019, Saturday  12/23/2019, Monday
12/08/2019, Sunday    12/23/2019, Monday
12/09/2019, Monday    12/23/2019, Monday
12/10/2019, Tuesday   12/24/2019, Tuesday
12/11/2019, Wednesday 12/27/2019, Friday
12/12/2019, Thursday  12/30/2019, Monday
12/13/2019, Friday    12/31/2019, Tuesday

13 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899753
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karbka
Компактно, спасибо!
karbka
но вдруг кто элегантнее решение знает.
PL/SQL. SQL притянут за гланды.

P.S. Ты слишком узко смотришь на проблему праздников. Возможно в сильно пьющих странах выход на работу между выходными и праздником, скажем, в среду - это норма. Но некоторые страны оптимизируют "дыры", перенося их на субботы. И тогда только в том году понедельник (пятница) выходной, а какая-то суббота в этом же месяце рабочая.
...
Рейтинг: 0 / 0
Исключение выходные
    #39899889
karbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic

P.S. Ты слишком узко смотришь на проблему праздников. Возможно в сильно пьющих странах выход на работу между выходными и праздником, скажем, в среду - это норма. Но некоторые страны оптимизируют "дыры", перенося их на субботы. И тогда только в том году понедельник (пятница) выходной, а какая-то суббота в этом же месяце рабочая.


Может, и не сильно, но часто точно :)

Насколько понимаю в ЮК немного другой подход:
https://www.gov.uk/bank-holidays
Есть список (даже не календарь) праздников на официальном сайте правительства. Часть из этих праздников не зависит от конкретной даты, как например, "Early May bank holiday" или "Summer bank holiday", аля такой-то понедельник месяца, чтобы у народа было несколько дней подряд на отдых. Соответственно сб, вс всегда выходные плюс опционально праздники. Видимо, поэтому такая реализация...
...
Рейтинг: 0 / 0
Исключение выходные
    #39900006
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за оффтоп, но
Elic
Возможно в сильно пьющих странах выход на работу между выходными и праздником, скажем, в среду - это норма.

как-то жаль прибалтов... Данные точные?
...
Рейтинг: 0 / 0
Исключение выходные
    #39900570
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Сорри за оффтоп, но
, тем не менее, ты меня прекрасно понял.
...
Рейтинг: 0 / 0
Исключение выходные
    #39900829
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
andrey_anonymous
Сорри за оффтоп, но
, тем не менее, ты меня прекрасно понял.

То есть ты действительно уверен, что в Молдавии, Германии или Литве не переносят праздники?
Удивительно.
Пруф, быть может, представишь?
...
Рейтинг: 0 / 0
Исключение выходные
    #39900835
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
не переносят праздники
Праздники нигде не переносят... но ты меня прекрасно понял!(?)
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Исключение выходные
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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