Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывод рабочих дней / 9 сообщений из 9, страница 1 из 1
01.03.2017, 14:59
    #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
01.03.2017, 15:16
    #39412510
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод рабочих дней
А не имел ли преподаватель в виду, что решать "задачу" ты должен сам?
...
Рейтинг: 0 / 0
01.03.2017, 15:27
    #39412521
Person2713
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод рабочих дней
Elic, да может и имел, только за 2 академических часа, в которых он объяснял, что такое иерархические запросы, аналитические функции, блок with, операторы union, union all, intesect и т.д. образовалась только каша, и ничего более.
...
Рейтинг: 0 / 0
01.03.2017, 15:46
    #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
01.03.2017, 15:47
    #39412554
Jafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод рабочих дней
Person2713,

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

да только когда я его спросил о дополнительной литературе, он сказал, что в книгах много написано и долго читать и разбираться придется, вместо этого он решил лучше рассказывать. Ну все-таки я у него название одной книге выпросил)
...
Рейтинг: 0 / 0
01.03.2017, 16:11
    #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
01.03.2017, 16:21
    #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
06.03.2017, 17:08
    #39414888
Person2713
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод рабочих дней
Dshedoo, stax спасибо за решения, буду разбираться.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывод рабочих дней / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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