Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Определение следующего рабочего дня / 12 сообщений из 12, страница 1 из 1
27.11.2017, 09:31
    #39559794
Askat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
Приветсвую всех!

Есть таблица holiday, где заранее записаны не рабочие дни:

id | holidaysdate
==========================
1 25.11.2017
2 26.11.2017
3 02.12.2017
4 03.12.2017
.....
И т.д.

Подскажите пожалуйста, как определить следующий рабочий день?
...
Рейтинг: 0 / 0
27.11.2017, 09:49
    #39559800
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
...
Рейтинг: 0 / 0
27.11.2017, 10:32
    #39559824
Определение следующего рабочего дня
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with holiday(h) as (select date '2017-11-28' from dual union all select date '2017-11-29' from dual union all select date '2017-12-01' from dual)
, data(d) as (select date '2017-11-27' from dual)
, hh as (
   select *
   from holiday
   match recognize (
      order by h
      measures final last(h)+1 as next_d
      all rows per match
      pattern (true ser*)
      define ser as ser.h = prev(ser.h) + 1
)  )
select d, nvl(next_d, d+1) next_d
from data
left join hh on d+1=h;
...
Рейтинг: 0 / 0
27.11.2017, 10:35
    #39559829
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
Askat,
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with calendar (id,dat) as (
  2  select 1, to_date('25.11.2017','dd.mm.yyyy') from dual union all
  3  select 2, to_date('26.11.2017','dd.mm.yyyy') from dual union all
  4  select 3, to_date('02.12.2017','dd.mm.yyyy') from dual union all
  5  select 4, to_date('03.12.2017','dd.mm.yyyy') from dual union all
  6  select 8, to_date('25.12.2017','dd.mm.yyyy') from dual
  7  )
  8  , t (d) as (
  9  select date '2017-11-20' d from dual
 10  union all
 11  select dat from t,calendar c where c.dat=t.d+1
 12  )
 13* select max(d)+1 d_work from t
SQL> /

D_WORK
--------
21.11.17

SQL> ed
Wrote file afiedt.buf

  1  with calendar (id,dat) as (
  2  select 1, to_date('25.11.2017','dd.mm.yyyy') from dual union all
  3  select 2, to_date('26.11.2017','dd.mm.yyyy') from dual union all
  4  select 3, to_date('02.12.2017','dd.mm.yyyy') from dual union all
  5  select 4, to_date('03.12.2017','dd.mm.yyyy') from dual union all
  6  select 8, to_date('25.12.2017','dd.mm.yyyy') from dual
  7  )
  8  , t (d) as (
  9  select date '2017-11-24' d from dual
 10  union all
 11  select dat from t,calendar c where c.dat=t.d+1
 12  )
 13* select max(d)+1 d_work from t
SQL> /

D_WORK
--------
27.11.17



......
stax
...
Рейтинг: 0 / 0
27.11.2017, 10:57
    #39559850
Askat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
Спасибо!
...
Рейтинг: 0 / 0
27.11.2017, 11:00
    #39559851
Askat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
[quote Stax]Askat,
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with calendar (id,dat) as (
  2  select 1, to_date('25.11.2017','dd.mm.yyyy') from dual union all
  3  select 2, to_date('26.11.2017','dd.mm.yyyy') from dual union all
  4  select 3, to_date('02.12.2017','dd.mm.yyyy') from dual union all
  5  select 4, to_date('03.12.2017','dd.mm.yyyy') from dual union all
  6  select 8, to_date('25.12.2017','dd.mm.yyyy') from dual
  7  )
  8  , t (d) as (
  9  select date '2017-11-20' d from dual
 10  union all
 11  select dat from t,calendar c where c.dat=t.d+1
 12  )
 13* select max(d)+1 d_work from t
SQL> /

D_WORK
--------
21.11.17

SQL> ed
Wrote file afiedt.buf

  1  with calendar (id,dat) as (
  2  select 1, to_date('25.11.2017','dd.mm.yyyy') from dual union all
  3  select 2, to_date('26.11.2017','dd.mm.yyyy') from dual union all
  4  select 3, to_date('02.12.2017','dd.mm.yyyy') from dual union all
  5  select 4, to_date('03.12.2017','dd.mm.yyyy') from dual union all
  6  select 8, to_date('25.12.2017','dd.mm.yyyy') from dual
  7  )
  8  , t (d) as (
  9  select date '2017-11-24' d from dual
 10  union all
 11  select dat from t,calendar c where c.dat=t.d+1
 12  )
 13* select max(d)+1 d_work from t
SQL> /

D_WORK
--------
27.11.17




Даже если в таблице будут указаны 4 нерабочих дней то покажет пятый день?
...
Рейтинг: 0 / 0
27.11.2017, 11:09
    #39559856
Определение следующего рабочего дня
AskatДаже если...Еще и конфеты за тебя есть?
...
Рейтинг: 0 / 0
27.11.2017, 11:24
    #39559870
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
Stax,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  1  with calendar (id,dat) as (
  2  select 1, to_date('25.11.2017','dd.mm.yyyy') from dual union all
  3  select 2, to_date('26.11.2017','dd.mm.yyyy') from dual union all
  4  select 2, to_date('27.11.2017','dd.mm.yyyy') from dual union all
  5  select 2, to_date('28.11.2017','dd.mm.yyyy') from dual union all
  6  select 2, to_date('29.11.2017','dd.mm.yyyy') from dual union all
  7  select 3, to_date('02.12.2017','dd.mm.yyyy') from dual union all
  8  select 4, to_date('03.12.2017','dd.mm.yyyy') from dual union all
  9  select 8, to_date('25.12.2017','dd.mm.yyyy') from dual
 10  )
 11  , t (d) as (
 12  select date '2017-11-24' d from dual --текущий день
 13  union all
 14  select dat from t,calendar c where c.dat=t.d+1
 15  )
 16* select max(d)+1 d_work from t
SQL> /

D_WORK
--------
30.11.17




зы
можно через connect by но лень набирать, если надо нарисую
.....
stax
...
Рейтинг: 0 / 0
29.11.2017, 11:57
    #39561153
Askat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
Тридевятый царьAskatДаже если...Еще и конфеты за тебя есть?

Конфеты есть ненадо лучше идеи подкидывай😉
...
Рейтинг: 0 / 0
30.11.2017, 11:00
    #39561805
vladimir74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
AskatЕсть таблица holiday, где заранее записаны не рабочие дни:
Для многих стран этих даных недостаточно. Для России напримр нужны ещё записи рабочих выходных дней
...
Рейтинг: 0 / 0
30.11.2017, 12:38
    #39561884
Определение следующего рабочего дня
vladimir74недостаточноЧтобы что-то не исключать, достаточно его не включать. Судя по приведенным исходным данным, а имено - обычно-выходные дни, табличка содержит полный набор выходных.
...
Рейтинг: 0 / 0
30.11.2017, 14:26
    #39561959
vladimir74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение следующего рабочего дня
обходимое недостаточноеvladimir74недостаточноЧтобы что-то не исключать, достаточно его не включать. Судя по приведенным исходным данным, а имено - обычно-выходные дни, табличка содержит полный набор выходных.
да, ты прав, я с утра о такой возможности даже не подумал.
Беру свои слова обратно.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Определение следующего рабочего дня / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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