powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывод рабочих дней
9 сообщений из 9, страница 1 из 1
Вывод рабочих дней
    #39412490
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Необходимо решить след. задачу:
Для каждого месяца текущего года найти первые и последние рабочие и выходные дни
с учетом праздников и переносов выходных дней (на 2016 год эту информацию можно посмотреть,
например, на странице http://www.interfax.ru/russia/469373). Для формирования списка всех
дней текущего года использовать иерархический запрос, оформленный в виде подзапроса в секции with.
Праздничные дни и переносы выходных также задать в виде подзапроса в секции with (с помощью union all
перечислить все даты, в которых рабочие/выходные дни не совпадают с обычной логикой определения выходного
дня как субботы и воскресения). Запрос должен корректно работать, если добавить изменить какие угодно
выходные/рабочие дни в данном подзапросе. Вывести поля: месяц в виде первого числа месяца, первый выходной
день месяца, последний выходной день, первый праздничный день, последний праздничный день.

Написал запрос который выводит первые и последние рабочие и выходные дни.
Код: 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.
with t(dt) as (
  select  trunc(sysdate, 'YY') + level - 1 as dt
    from  dual
    connect by trunc(trunc(sysdate, 'YY') + level - 1, 'YY') = trunc(sysdate, 'YY')
    /*union all
    select  date'2017-01-2' as dt from  dual union all
    select  date'2017-01-3' as dt from  dual union all
    select  date'2017-01-4' as dt from  dual union all
    select  date'2017-01-5' as dt from  dual union all
    select  date'2017-01-6' as dt from  dual union all
    select  date'2017-02-23' as dt from  dual union all
    select  date'2017-02-24' as dt from  dual union all
    select  date'2017-03-8' as dt from  dual union all 
    select  date'2017-05-1' as dt from  dual union all 
    select  date'2017-05-8' as dt from  dual union all 
    select  date'2017-05-9' as dt from  dual union all
    select  date'2017-06-12' as dt from  dual union all
    select  date'2017-11-6' as dt from  dual  */
    )
    select  distinct 
            to_char(t.dt, 'MM') as number_month,
            (trunc(t.dt, 'MM') + case trim(to_char(trunc(t.dt,'MM'), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
              when 'SUNDAY' then 1
              when 'SATURDAY' then 2    
              else 0
            end) as first_work_day,
            (trunc(t.dt, 'MM') + case trim(to_char(trunc(t.dt,'MM'), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
              when 'MONDAY' then 5
              when 'TUESDAY' then 4
              when 'WEDNESDAY' then 3
              when 'THURSDAY' then 2
              when 'FRIDAY' then 1
              else 0
            end) as first_day_off,
            (last_day(t.dt) - case trim(to_char(last_day(t.dt), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
              when 'SUNDAY' then 2
              when 'SATURDAY' then 1
              else 0
            end) as last_work_day,
            (last_day(t.dt) - case trim(to_char(last_day(t.dt), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
             when 'MONDAY' then 1
             when 'TUESDAY' then 2
             when 'WEDNESDAY' then 3
             when 'THURSDAY' then 4
             when 'FRIDAY' then 5
             else 0
            end) as last_day_off
      from t
      order by number_month;



С логикой переноса праздничных дней не могу разобраться.
На форуме искал похожу задачу, вроде что-то нашел, но там не было реализована логика переноса. Если есть кинете ссылку, то буду благодарен.
...
Рейтинг: 0 / 0
Вывод рабочих дней
    #39412510
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не имел ли преподаватель в виду, что решать "задачу" ты должен сам?
...
Рейтинг: 0 / 0
Вывод рабочих дней
    #39412521
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, да может и имел, только за 2 академических часа, в которых он объяснял, что такое иерархические запросы, аналитические функции, блок with, операторы union, union all, intesect и т.д. образовалась только каша, и ничего более.
...
Рейтинг: 0 / 0
Вывод рабочих дней
    #39412553
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Person2713Всем привет. Необходимо решить след. задачу:
Для каждого месяца текущего года найти первые и последние рабочие и выходные дни
с учетом праздников и переносов выходных дней (на 2016 год эту информацию можно посмотреть,
например, на странице http://www.interfax.ru/russia/469373). Для формирования списка всех
дней текущего года использовать иерархический запрос, оформленный в виде подзапроса в секции with.
Праздничные дни и переносы выходных также задать в виде подзапроса в секции with (с помощью union all
перечислить все даты, в которых рабочие/выходные дни не совпадают с обычной логикой определения выходного
дня как субботы и воскресения). Запрос должен корректно работать, если добавить изменить какие угодно
выходные/рабочие дни в данном подзапросе. Вывести поля: месяц в виде первого числа месяца, первый выходной
день месяца, последний выходной день, первый праздничный день, последний праздничный день.

Написал запрос который выводит первые и последние рабочие и выходные дни.
Код: 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.
with t(dt) as (
  select  trunc(sysdate, 'YY') + level - 1 as dt
    from  dual
    connect by trunc(trunc(sysdate, 'YY') + level - 1, 'YY') = trunc(sysdate, 'YY')
    /*union all
    select  date'2017-01-2' as dt from  dual union all
    select  date'2017-01-3' as dt from  dual union all
    select  date'2017-01-4' as dt from  dual union all
    select  date'2017-01-5' as dt from  dual union all
    select  date'2017-01-6' as dt from  dual union all
    select  date'2017-02-23' as dt from  dual union all
    select  date'2017-02-24' as dt from  dual union all
    select  date'2017-03-8' as dt from  dual union all 
    select  date'2017-05-1' as dt from  dual union all 
    select  date'2017-05-8' as dt from  dual union all 
    select  date'2017-05-9' as dt from  dual union all
    select  date'2017-06-12' as dt from  dual union all
    select  date'2017-11-6' as dt from  dual  */
    )
    select  distinct 
            to_char(t.dt, 'MM') as number_month,
            (trunc(t.dt, 'MM') + case trim(to_char(trunc(t.dt,'MM'), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
              when 'SUNDAY' then 1
              when 'SATURDAY' then 2    
              else 0
            end) as first_work_day,
            (trunc(t.dt, 'MM') + case trim(to_char(trunc(t.dt,'MM'), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
              when 'MONDAY' then 5
              when 'TUESDAY' then 4
              when 'WEDNESDAY' then 3
              when 'THURSDAY' then 2
              when 'FRIDAY' then 1
              else 0
            end) as first_day_off,
            (last_day(t.dt) - case trim(to_char(last_day(t.dt), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
              when 'SUNDAY' then 2
              when 'SATURDAY' then 1
              else 0
            end) as last_work_day,
            (last_day(t.dt) - case trim(to_char(last_day(t.dt), 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'))
             when 'MONDAY' then 1
             when 'TUESDAY' then 2
             when 'WEDNESDAY' then 3
             when 'THURSDAY' then 4
             when 'FRIDAY' then 5
             else 0
            end) as last_day_off
      from t
      order by number_month;



С логикой переноса праздничных дней не могу разобраться.
На форуме искал похожу задачу, вроде что-то нашел, но там не было реализована логика переноса. Если есть кинете ссылку, то буду благодарен.

уточните,
1)выходной ето субота/воскресенье/праздник?
2) есть ли рабочие суботы?
3) праздники перечислены в union all?

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

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

да только когда я его спросил о дополнительной литературе, он сказал, что в книгах много написано и долго читать и разбираться придется, вместо этого он решил лучше рассказывать. Ну все-таки я у него название одной книге выпросил)
...
Рейтинг: 0 / 0
Вывод рабочих дней
    #39412581
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Person2713,
Код: 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.
with t as (  
     select  trunc(sysdate, 'YY') + level - 1 as dt
    from  dual
    connect by trunc(trunc(sysdate, 'YY') + level - 1, 'YY') = trunc(sysdate, 'YY'))
, z as (
    select  to_date('2017-01-02','YYYY-MM-DD') from  dual union all
    select  to_date('2017-01-03','YYYY-MM-DD') from  dual union all
    select  to_date('2017-01-04','YYYY-MM-DD') from  dual union all
    select  to_date('2017-01-05','YYYY-MM-DD') from  dual union all
    select  to_date('2017-01-06','YYYY-MM-DD') from  dual union all
    select  to_date('2017-02-23','YYYY-MM-DD') from  dual union all
    select  to_date('2017-02-24','YYYY-MM-DD') from  dual union all
    select  to_date('2017-03-08','YYYY-MM-DD') from  dual union all 
    select  to_date('2017-05-01','YYYY-MM-DD') from  dual union all 
    select  to_date('2017-05-08','YYYY-MM-DD') from  dual union all 
    select  to_date('2017-05-09','YYYY-MM-DD') from  dual union all
    select  to_date('2017-06-12','YYYY-MM-DD') from  dual union all
    select  to_date('2017-11-06','YYYY-MM-DD') from  dual )
, x as (select dt,
case when trim(to_char(dt, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH')) in ('SUNDAY','SATURDAY') then 'N' else 'Y' end as rab
 from t)
select x.dt,
case when z.dt is not null and x.rab = 'Y' then replace(rab,'Y','N')
     when z.dt is not null and x.rab = 'N' then replace(rab,'N','Y')
     else x.rab end as rab
 from x full join z on z.dt = x.dt 
order by 1


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

заготовка (странно что 01/01/17 не праздничный)


Код: 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.
  1  with t(dt) as (
  2    select  trunc(sysdate, 'YY') + level - 1 as dt
  3      from  dual
  4      connect by trunc(trunc(sysdate, 'YY') + level - 1, 'YY') = trunc(sysdate, 'YY')
  5   )
  6  ,s(ds) as (
  7      select  date'2017-01-2' as dt from  dual union all
  8      select  date'2017-01-3' as dt from  dual union all
  9      select  date'2017-01-4' as dt from  dual union all
 10      select  date'2017-01-5' as dt from  dual union all
 11      select  date'2017-01-6' as dt from  dual union all
 12      select  date'2017-02-23' as dt from  dual union all
 13      select  date'2017-02-24' as dt from  dual union all
 14      select  date'2017-03-8' as dt from  dual union all
 15      select  date'2017-05-1' as dt from  dual union all
 16      select  date'2017-05-8' as dt from  dual union all
 17      select  date'2017-05-9' as dt from  dual union all
 18      select  date'2017-06-12' as dt from  dual union all
 19      select  date'2017-11-6' as dt from  dual
 20      )
 21  select trunc(dt,'mm') mm
 22   ,min(case when DT - TRUNC(DT,'IW') in (5,6) or s.ds is not null then dt end) first_free
 23   ,max(case when DT - TRUNC(DT,'IW') in (5,6) or s.ds is not null then dt end) last_free
 24   ,min(s.ds) first_celebratory
 25   ,max(s.ds) last_celebratory
 26  from t,s
 27  where t.dt=s.ds(+)
 28  group by trunc(dt,'mm')
 29* order by 1
SQL> /

MM       FIRST_FR LAST_FRE FIRST_CE LAST_CEL
-------- -------- -------- -------- --------
01.01.17 01.01.17 29.01.17 02.01.17 06.01.17
01.02.17 04.02.17 26.02.17 23.02.17 24.02.17
01.03.17 04.03.17 26.03.17 08.03.17 08.03.17
01.04.17 01.04.17 30.04.17
01.05.17 01.05.17 28.05.17 01.05.17 09.05.17
01.06.17 03.06.17 25.06.17 12.06.17 12.06.17
01.07.17 01.07.17 30.07.17
01.08.17 05.08.17 27.08.17
01.09.17 02.09.17 30.09.17
01.10.17 01.10.17 29.10.17
01.11.17 04.11.17 26.11.17 06.11.17 06.11.17
01.12.17 02.12.17 31.12.17

12 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Вывод рабочих дней
    #39414888
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo, stax спасибо за решения, буду разбираться.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывод рабочих дней
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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