powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбить период на подпериоды.
10 сообщений из 10, страница 1 из 1
Разбить период на подпериоды.
    #39618933
vi85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть необходимость разбивки периода на несколько периодов. Например,
период 01.03.2018 - 10.03.2018
и два (их может быть больше) периода:
03.03.2018 - 05.03.2018,
07.03.2018 - 08.03.2018
В результате нужно получить периоды в которые не входят выше указанные периоды,т.е. результат должен быть :
01.03.2018 - 02.03.2018, 06.03.2018 - 06.03.2018, 09.03.2018 - 10.03.2018

Ситуации могут быть когда даты первого периода находятся внутри последующих периодов, например
01.03.2018 - 10.03.2018
и 03.02.2018 - 12.03.2018 , в таком случае запрос не должен выдавать резулльтат.

01.03.2018 - 10.03.2018 и 25.02.2018 - 03.03.2018 в результате будет 04.03.2018- 10.03.2018
01.03.2018 - 10.03.2018 и 05.03.2018 - 13.03.2018 в результате будет 11.03.2018- 13.03.2018
и тд

Может кто сталкивался с такой задачей , возможно ли запросом решиь данную задачу?
Заранее благодарю за ответы.
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39618946
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi85,

например:
1. берешь таблицу всех дат по первому периоду
2. исключаешь даты последующих периодов
3. остаток группируешь по sog
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39618967
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi85,

вечная тема, пересекающиеся интервалы

если делать влоб

1) соеденяем каждый с кажным (получаем подинтервальчики)
2) выбрасываем дубли


ps
лень тестовые данные набивать

.....
stax
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39618975
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi85,

тю, ето ж проще
исходный ж перид один одиношенький

гляньте с другой стороны
"разбить/обьеденить" несколько периодов одним

....
stax
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39619220
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

А можно пример?
Развернуть все интервалы в строки, затем убрать пересекающиеся - это довольно просто.
А как потом строки собрать обратно в период?
Например:
01.01.2018
02.01.2018
03.01.2018
07.01.2018
08.01.2018
Как привести к виду:
01.01.2018 - 03.01.2018
07.01.2018 - 08.01.2018
?
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39619254
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

SOG 21277815
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39619278
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgoрDshedoo,

SOG 21277815
Действительно.
Ещё нашёл такую интересную штуку:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select min (beg_date) as beg_date,
       max (end_date) as end_date
from (
      select beg_date,
             end_date,
             sum(strt_grp) over (order by beg_date, end_date ) grp_num
      from (
             select  beg_date,
                     end_date,
                     case when beg_date > 1 + max(end_date) over (order by beg_date, end_date rows between unbounded preceding and 1 preceding) then 1 end strt_grp
             from table
           )
     )
group by grp_num
order by beg_date;
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39619284
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2  select to_date('01.01.2018','dd.mm.yyyy') d from dual union all
  3  select to_date('02.01.2018','dd.mm.yyyy') d from dual union all
  4  select to_date('03.01.2018','dd.mm.yyyy') d from dual union all
  5  select to_date('07.01.2018','dd.mm.yyyy') d from dual union all
  6  select to_date('08.01.2018','dd.mm.yyyy') d from dual
  7  )
  8  , tt as (
  9  select
 10    d
 11   ,d-row_number() over (order by d) gr
 12  from t)
 13  select min(d) b,max(d) e
 14  from tt
 15  group by gr
 16* order by 1
 17  /

B        E
-------- --------
01.01.18 03.01.18
07.01.18 08.01.18



зы
если появится время, попробую без разворачивания в дни

....
stax
...
Рейтинг: 0 / 0
Разбить период на подпериоды.
    #39619323
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

сильно не тестировал
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t1 as (
  2  select date '2018-03-01' sstart,date '2018-03-31' stop from dual )
  3  ,t2 as (
  4  select date '2018-03-05' b,date '2018-03-10' e from dual union all
  5  select date '2018-03-07' b,date '2018-03-13' e from dual union all
  6  select date '2018-03-15' b,date '2018-03-17' e from dual union all
  7  select date '2018-03-17' b,date '2018-03-20' e from dual union all
  8  select date '2018-03-27' b,date '2018-03-29' e from dual
  9  --select date '2018-03-01' b,date '2018-03-31' e from dual
 10  )
 11  ,d2 as (
 12  --для юнион алл
 13  select  1 n from dual union all
 14  select -1 n from dual)
 15  ,t as (
 16  --выбрасываем лишнее (не пересекающиеся)
 17    select case when b<=sstart then sstart-1 else b end b
 18          ,case when e>=stop   then stop+1   else e end e
 19    from t2,t1
 20    where b<=stop and e>=sstart
 21    union all
 22  --добавляем главный диапазон
 23    select sstart-1,stop+1 from t1)
 24  ,tt as (
 25  --в столбик
 26    select decode (n,1,b,e) d,n,sum(n) over (order by decode (n,1,b,e)) s from t,d2)
 27  ,ttt as (
 28  -- оратно в диапазоны
 29    select
 30     d b
 31    ,lead(d) over (order by d,s desc) e
 32    ,s s1
 33    ,lead(s) over (order by d,s desc) s2
 34    from tt
 35  )
 36  select
 37  --вывод не "пересекающихся"
 38   b+1 b,e-1 e
 39  -- *
 40  from ttt
 41  where s1=1
 42* order by 1
SQL> /

B        E
-------- --------
01.03.18 04.03.18
14.03.18 14.03.18
21.03.18 26.03.18
30.03.18 31.03.18

SQL>



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


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