powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Диапазон дат.
10 сообщений из 10, страница 1 из 1
Диапазон дат.
    #39879342
AXEL_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Столкнулся с проблемой с отображением месяца и года с диапазоне дат.
Задача состоит в том что, нужно отобразить название книги, месяц и год (по вертикали) из диапазона дат.
В таблице 1 хранится название книги (name_book) (название может повторяться, но id разный), а в таблице 2 (может быть несколько периодов) дата входа книги в магазин (d_strt) и дата выхода книги с магазина (d_finish).
Результат 1 и 2 таблицы:

id name book d_start d_finish1 Книга 1 01.01.2017 07.03.20182 Книга 1 03.07.2018 06.02.20193 Книга 2 23.07.2017 19.09.20174 Книга 2 28.08.2017 15.10.20185 Книга 3 05.02.2019 11.07.2019

Когда использую connect by level <= (d_finish - d_start) + 1 ) и задаю конкретные условия (книга встречается только один раз и имеет один диапазон дат, то все отображает нормально, в виде:
name book periodКнига 3 02.2019Книга 3 03.2019Книга 3 04.2019Книга 3 05.2019Книга 3 06.2019Книга 3 07.2019

Когда использую connect by level <= (d_finish - d_start) + 1 ) , книга имеет несколько записей и диапазонов дат, то отображается какой-то бред (дубли и очень много строк, а задать группировку то зависает).

Помогите решить такую проблему.
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879355
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AXEL_111,

что должно получиться для "Книга 2" ?
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879362
AXEL_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййAXEL_111,

что должно получиться для "Книга 2" ?


Результат для Книги 2:

name_book periodКнига 2 Лип.17Книга 2 Сер.17Книга 2 Вер.17Книга 2 Сер.17Книга 2 Вер.17Книга 2 Жов.17

после группировки:

name_book periodКнига 2 Лип.17Книга 2 Сер.17Книга 2 Вер.17Книга 2 Жов.17
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879365
AXEL_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AXEL_111123ййAXEL_111,

что должно получиться для "Книга 2" ?


Результат для Книги 2:

name_book periodКнига 2 07.2017Книга 2 08.2017Книга 2 09.2017Книга 2 08.2017Книга 2 09.2017Книга 2 10.2017

после группировки:

name_book periodКнига 2 07.2017Книга 2 08.2017Книга 2 09.2017Книга 2 10.2017
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879377
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AXEL_1114 Книга 2 28.08.2017 15.10.2018
а куда делся 2018 ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t(id, name_book, d_start, d_finish ) as (
select 1, 'Книга 1', to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy')    from dual union
select 2, 'Книга 1', to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy')    from dual
)
select t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)  from t
,xmltable('0 to xs:integer($n)' passing MONTHS_BETWEEN(trunc(d_finish,'mm'),trunc(d_start,'mm')) as "n" columns rn number path '.')
group by t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879381
AXEL_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййAXEL_1114 Книга 2 28.08.2017 15.10.2018
а куда делся 2018 ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t(id, name_book, d_start, d_finish ) as (
select 1, 'Книга 1', to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy')    from dual union
select 2, 'Книга 1', to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy')    from dual
)
select t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)  from t
,xmltable('0 to xs:integer($n)' passing MONTHS_BETWEEN(trunc(d_finish,'mm'),trunc(d_start,'mm')) as "n" columns rn number path '.')
group by t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)



Прошу прощение в суматохе не отобразил.
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879386
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
with data(id,name,book,d_start,d_finish)
  as (
      select 1,'Book',1,to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy') from dual union all
      select 2,'Book',1,to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy') from dual union all
      select 3,'Book',2,to_date('23.07.2017','dd.mm.yyyy'),to_date('19.09.2017','dd.mm.yyyy') from dual union all
      select 4,'Book',2,to_date('28.08.2017','dd.mm.yyyy'),to_date('15.10.2018','dd.mm.yyyy') from dual union all
      select 5,'Book',3,to_date('05.02.2019','dd.mm.yyyy'),to_date('11.07.2019','dd.mm.yyyy') from dual
     )
select  distinct name,
                 book,
                 period
  from  data,
        lateral(
                select  add_months(trunc(d_start,'mm'),level - 1) period
                  from  dual
                  connect by level <= months_between(trunc(d_finish,'mm'),trunc(d_start,'mm')) + 1
               )
  order by book,
           period
/

NAME       BOOK PERIOD
---- ---------- ---------
Book          1 01-JAN-17
Book          1 01-FEB-17
Book          1 01-MAR-17
Book          1 01-APR-17
Book          1 01-MAY-17
Book          1 01-JUN-17
Book          1 01-JUL-17
Book          1 01-AUG-17
Book          1 01-SEP-17
Book          1 01-OCT-17
Book          1 01-NOV-17
Book          1 01-DEC-17
Book          1 01-JAN-18
Book          1 01-FEB-18
Book          1 01-MAR-18
Book          1 01-JUL-18
Book          1 01-AUG-18
Book          1 01-SEP-18
Book          1 01-OCT-18
Book          1 01-NOV-18
Book          1 01-DEC-18
Book          1 01-JAN-19
Book          1 01-FEB-19
Book          2 01-JUL-17
Book          2 01-AUG-17
Book          2 01-SEP-17
Book          2 01-OCT-17
Book          2 01-NOV-17
Book          2 01-DEC-17
Book          2 01-JAN-18
Book          2 01-FEB-18
Book          2 01-MAR-18
Book          2 01-APR-18
Book          2 01-MAY-18
Book          2 01-JUN-18
Book          2 01-JUL-18
Book          2 01-AUG-18
Book          2 01-SEP-18
Book          2 01-OCT-18
Book          3 01-FEB-19
Book          3 01-MAR-19
Book          3 01-APR-19
Book          3 01-MAY-19
Book          3 01-JUN-19
Book          3 01-JUL-19

45 rows selected.

SQL> 



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

осталось узнать какой вариант подходит автору
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879393
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DISTINCT не нужен если диапазоны книги не пересекаются.

SY.
...
Рейтинг: 0 / 0
Диапазон дат.
    #39879505
AXEL_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Очень помогли. Данный метод на select отображает все отлично, но таблицу создать не могу (ругается ora - 03113).

AXEL_111123ййпропущено...

а куда делся 2018 ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t(id, name_book, d_start, d_finish ) as (
select 1, 'Книга 1', to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy')    from dual union
select 2, 'Книга 1', to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy')    from dual
)
select t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)  from t
,xmltable('0 to xs:integer($n)' passing MONTHS_BETWEEN(trunc(d_finish,'mm'),trunc(d_start,'mm')) as "n" columns rn number path '.')
group by t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)



Прошу прощение в суматохе не отобразил.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Диапазон дат.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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