powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить все периоды действия и бездействия параметра в заданном промежутке.
3 сообщений из 3, страница 1 из 1
Получить все периоды действия и бездействия параметра в заданном промежутке.
    #39775174
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется есть проще решение, но придумать не могу. Oracle 12.2
Есть период в котором параметр может действовать или не действовать. причем период действия параметр может начинаться раньше периода или даты окончания действия параметра может не быть. Получить все периоды действия и бездействия параметра.
Код: 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.
with t as
 (select date '2018-01-01' cd_st, to_date('2018-01-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en from dual),
t2 as
 (select date '2017-09-04' cd_st, to_date('2018-01-05 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en, 1 par
    from dual
   where 1 = 1
  union all
  select date '2018-01-10' cd_st, to_date('2018-01-20 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en, 2 par
    from dual
   where 1 = 1
  union all
  select date '2018-01-21' cd_st, to_date('2018-01-28 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en, 3 par
    from dual
   where 1 = 1),
t3 as
 (select decode(lv, 1, t.cd_st, 2, t.cd_en + interval '1' second) cd_date, null par
    from t
   cross join (select 1 lv from dual union all select 2 from dual)
  union all
  select decode(lv, 1, greatest(t2.cd_st, t.cd_st), 2, nvl(t2.cd_en, t.cd_en) + interval '1' second) cd_date,
         decode(lv, 1, par) par
    from t
    join t2 on t.cd_st <= nvl(t2.cd_en, t.cd_st)
           and t.cd_st <= nvl(t2.cd_en, t.cd_st)
   cross join (select 1 lv from dual union all select 2 from dual))
select cd_date, lead(cd_date - interval '1' second) over(order by cd_date), max(par) from t3 group by cd_date
...
Рейтинг: 0 / 0
Получить все периоды действия и бездействия параметра в заданном промежутке.
    #39775181
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VintЕсть период в котором параметр может действовать или не действовать. причем период действия параметр может начинаться раньше периода или даты окончания действия параметра может не быть. http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM . И, отсмеявшись, поработай над русским.
Vint
Код: plsql
1.
2.
            on t.cd_st <= nvl(t2.cd_en, t.cd_st)
           and t.cd_st <= nvl(t2.cd_en, t.cd_st)

Найди 10 отличий.
...
Рейтинг: 0 / 0
Получить все периоды действия и бездействия параметра в заданном промежутке.
    #39775190
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,
спасибо ты как всегда очень внимателен, а я поторопился в очередной раз.
Последняя строка так же лишняя, но еще один подзапрос писать не буду.
Код: 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.
with t as
 (select date '2018-01-01' cd_st, to_date('2018-01-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en from dual),
t2 as
 (select date '2017-09-04' cd_st, to_date('2018-01-05 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en, 1 par
    from dual
   where 1 = 1
  union all
  select date '2018-01-10' cd_st, to_date('2018-01-20 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en, 2 par
    from dual
   where 1 = 1
  union all
  select date '2018-01-21' cd_st, to_date('2018-01-28 23:59:59', 'yyyy-mm-dd hh24:mi:ss') cd_en, 3 par
    from dual
   where 1 = 1),
t3 as
 (select decode(lv, 1, t.cd_st, 2, t.cd_en + interval '1' second) cd_date, null par
    from t
   cross join (select 1 lv from dual union all select 2 from dual)
  union all
  select decode(lv, 1, greatest(t2.cd_st, t.cd_st), 2, nvl(t2.cd_en, t.cd_en) + interval '1' second) cd_date,
         decode(lv, 1, par) par
    from t
    join t2 on t.cd_st <= nvl(t2.cd_en, t.cd_st)
           and t2.cd_st <= t.cd_en
   cross join (select 1 lv from dual union all select 2 from dual))
select cd_date, lead(cd_date - interval '1' second) over(order by cd_date), max(par) from t3 group by cd_date
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить все периоды действия и бездействия параметра в заданном промежутке.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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