powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Исключение выходные
25 сообщений из 32, страница 1 из 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
25 сообщений из 32, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Исключение выходные
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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