Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
masir0n
Member

Откуда:
Сообщений: 26
Выгрузить все terminal_device_id, у которых тарифный план Псков - Тарифище 082018 (МАСС) (SCP) за февраль месяц был хотя бы 1 секунду !

фишка в том что бы учитывались id и тех кто активных, т.е. у кого date_to = null, не закрыты
допустим они могли подключиться в декабре и по сей день сидеть на этом плане , мне нужно и таких учитывать
А у меня получается только учитывать либо строго за февраль месяц , тех у кого как то меняется план или просто у кого он уже есть, но при этом еще только тех, кто закрыл этот тарифный план в феврале, а мне нужно еще активных учитывать
Либо опять же получается всех учитываю и тех кто подключился до февраля и тех кто после февраля с этим тарифом, но уже не активных все равно, тк они закрыли этот план и перешли на другой

вот код



select td.terminal_device_id, td.date_from, td.date_to, tp.tariff_plan_name, tp.tariff_plan_id
from cust.terminal_device td inner join rd.tariff_plan tp
on td.tariff_plan_id = tp.tariff_plan_id
inner join cust.terminal_device td2
on td.terminal_device_id=td2.terminal_device_id


where td2.date_to between to_date('01.02.2020 00:00:00', 'dd.mm.yyyy hh24:mi:ss') and to_date ('29.02.2020 23.59.59', 'dd.mm.yyyy hh24:mi:ss')
and td.date_to >= td2.date_from+1/86400
and tp.tariff_plan_name = 'Псков - Тарифище 082018 (МАСС) (SCP)'


and exists (select td3.date_from from cust.terminal_device td3
where td.terminal_device_id=td3.terminal_device_id
and td3.date_to is null
);
25 мар 20, 10:33    [22105547]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
masir0n
Member

Откуда:
Сообщений: 26
masir0n, подсказали что с помощью greatest и least, пока что не совсем понимаю как
25 мар 20, 12:13    [22105617]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2260
masir0n,

Вам надо выбирать строки у которых пересекаются два интервала/диапазона

февраль to_date('01.02.2020 00:00:00', 'dd.mm.yyyy hh24:mi:ss') and to_date ('29.02.2020 23.59.59')
и date_from and nvl(date_to,date '9999-12-30')

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

.....
stax
25 мар 20, 12:44    [22105640]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2260
masir0n
masir0n, подсказали что с помощью greatest и least, пока что не совсем понимаю как


SQL> ed
Wrote file afiedt.buf

  1  with tarif (id,from_date,to_date) as (
  2  select 1,date '2020-01-01',date '2020-01-31' from dual union all
  3  select 2,date '2020-01-02',date '2020-02-02' from dual union all
  4  select 3,date '2020-01-03',null from dual union all
  5  select 4,date '2020-02-01',date '2020-02-29' from dual union all
  6  select 5,date '2020-02-02',date '2020-03-29' from dual union all
  7  select 6,date '2020-02-03',null from dual union all
  8  select 7,date '2020-03-01',date '2020-05-29' from dual union all
  9  select 8,date '2020-03-03',null from dual)
 10  select * from tarif
 11  where greatest(from_date,date '2020-02-02')<=
 12*       least(nvl(to_date,date'3333-12-31'), to_date ('29.02.2020 23.59.59', 'dd.mm.yyyy hh24:mi:ss'))
SQL> /

        ID FROM_DATE  TO_DATE
---------- ---------- ----------
         2 02.01.2020 02.02.2020
         3 03.01.2020
         4 01.02.2020 29.02.2020
         5 02.02.2020 29.03.2020
         6 03.02.2020


ps
хотя б я пользовал <= and ... >=


.....
stax
25 мар 20, 12:59    [22105651]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
masir0n
Member

Откуда:
Сообщений: 26
Stax,
Покажите пожалуйста , как реализовать
Не совсем ясно, зачем заменять ноль ( если он есть ) на '9999-12-30, что бы могли его захватить при запросе ?
Попробовал, вроде как ничего не изменилось
25 мар 20, 13:06    [22105664]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
masir0n
Member

Откуда:
Сообщений: 26
Stax,

Сейчас попробую
25 мар 20, 13:08    [22105666]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
PuM256
Member

Откуда:
Сообщений: 21
Или так:

SQL> with tarif (id,from_date,to_date) as (
  2      select 1,date '2020-01-01',date '2020-01-31' from dual union all
  3      select 2,date '2020-01-02',date '2020-02-02' from dual union all
  4      select 3,date '2020-01-03',null from dual union all
  5      select 4,date '2020-02-01',date '2020-02-29' from dual union all
  6      select 5,date '2020-02-02',date '2020-03-29' from dual union all
  7      select 6,date '2020-02-03',null from dual union all
  8      select 7,date '2020-03-01',date '2020-05-29' from dual union all
  9      select 8,date '2020-03-03',null from dual)
 10    select * from tarif
 11    Where
 12     	Date'2020-02-01' Between Trunc(from_date, 'Mon') And Trunc(Nvl(to_date, Sysdate), 'Mon');

        ID FROM_DATE   TO_DATE
---------- ----------- -----------
         2 1/2/2020    2/2/2020
         3 1/3/2020    
         4 2/1/2020    2/29/2020
         5 2/2/2020    3/29/2020
         6 2/3/2020


Сообщение было отредактировано: 25 мар 20, 13:12
25 мар 20, 13:13    [22105669]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2260
masir0n

Stax,
Покажите пожалуйста , как реализовать
Не совсем ясно, зачем заменять ноль ( если он есть ) на '9999-12-30, что бы могли его захватить при запросе ?
Попробовал, вроде как ничего не изменилось


автор
т.е. у кого date_to = null, не закрыты


можно и без nvl, но тогда ... OR is null ...

....
stax
25 мар 20, 13:26    [22105683]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
masir0n
Member

Откуда:
Сообщений: 26
Stax,

написал вот такой код , вроде все получилось, большое спасибо

select td.terminal_device_id, td.date_from, td.date_to, tp.tariff_plan_name, tp.tariff_plan_id
from cust.terminal_device td inner join rd.tariff_plan tp
on td.tariff_plan_id = tp.tariff_plan_id

* where greatest(td.date_from ,date '2020-02-02')<= least(nvl( td.date_to, date'3333-12-31'), to_date ('29.02.2020 23.59.59', 'dd.mm.yyyy hh24:mi:ss'))

and tp.tariff_plan_name = 'Псков - Тарифище 082018 (МАСС) (SCP)'

Но, не могли бы пояснить как именно это все работает вот в этой строке *, хочу понять как запрос выполняется
25 мар 20, 13:32    [22105689]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2260
masir0n
как именно это все работает вот в этой строке


я ж писал
автор
Вам надо выбирать строки у которых пересекаются два интервала/диапазона


одно из уcловий пересечения интервалов (по разному можно)


01/02 29/02
<==================>
From | To |
<------+-------> |
From | | To
<----+------------------+------>
| From | To
| <----------+-------------------
| |
| From To |
From To | <----------> |
<-----> | | From To
| | <--------->



не я советовал "подсказали что с помощью greatest и least"
просто привел пример c greatest и least

.....
stax
25 мар 20, 13:52    [22105701]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
Stax


START FINISH
<==================>
From | To |
<------+-------> |
From | | To
<----+------------------+------>
| From | To
| <----------+-------------------
| |
| From To |
From To | <----------> |
<-----> | | From To
| | <--------->


Попадание в интервал от START до FINISH очень хорошо описывается изящным условием
WHERE To > START  
  AND From < FINISH

(> или >= и < или <= отрегулируйте по вашей задаче)
25 мар 20, 14:21    [22105725]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
masir0n
Member

Откуда:
Сообщений: 26
Stax,
Спасибо
25 мар 20, 14:28    [22105737]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
masir0n
Member

Откуда:
Сообщений: 26
SQL*Plus,

Вот как, спасибо
25 мар 20, 14:28    [22105739]     Ответить | Цитировать Сообщить модератору
 Re: Как выгрузить определенные данные за период, где они засветились минимум 1 секунду  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2260
SQL*Plus,

автор
хотя б я пользовал <= and ... >=


отвечал на "посоветовали greatest ..."

.....
stax
25 мар 20, 14:33    [22105744]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить