Как рассчитать дату перекрытия - PullRequest
0 голосов
/ 15 апреля 2019

Вот пять записей аренды одним человеком, есть ли способ проверить, существует ли какой-либо перекрывающийся период займа, который длился более 30 дней среди этих 5 данных?

Например, (01-FEB-19 20-MAR-19) и (14-FEB-19 25-MAR-19) имеет перекрытие в течение 30 дней

РЕДАКТИРОВАТЬ: И Iищу сравнение 5 данных, чтобы получить ответ, если есть совпадение.Поскольку другие люди могут арендовать этот предмет 3 раза в течение следующих 3 периодов, я не знаю, как перебрать весь диапазон дат для каждого человека и проверить

Спасибо !!

    START_DAT  DATE_RETUN 
    -------------------- 
     19-FEB-19 20-FEB-19                          
     01-FEB-19 20-MAR-19                         
     14-FEB-19 25-MAR-19                         
     02-FEB-19 22-MAR-19                         
     14-FEB-19 25-FEB-19 

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

ЭТО ОТВЕТЫ НА ОРИГИНАЛЬНУЮ ВЕРСИЮ ВОПРОСА.

Вы можете рассчитать перекрытие, используя арифметику, и просто проверьте:

select t.*, t2.*
from t join
     t t2
     on t.start <= t2.return - interval '30' day and
        t.return >= t.start + interval '30' day
where (least(t1.return, t.return) - greatest(t.start, t2.start)) >= 30;

Настройки интервала в предложении on предназначены только дляэффективность.

0 голосов
/ 15 апреля 2019

В T-SQL это может быть достигнуто согласно следующему запросу:

select
p. * From (выберите T. *,

datediff (день, T.START_DAT, T.DATE_RETUN) как Overlap_days

из T) как p, где p.Overlap_days> = 30

0 голосов
/ 15 апреля 2019
with test_table as (
  select 1 id, to_date('19-02-2019', 'dd-mm-yyyy') from_dat,  to_date('20-02-2019', 'dd-mm-yyyy') to_dat from dual union all                          
  select 2 id, to_date('01-02-2019', 'dd-mm-yyyy') from_dat,  to_date('20-03-2019', 'dd-mm-yyyy') to_dat from dual union all                               
  select 3 id, to_date('14-02-2019', 'dd-mm-yyyy') from_dat,  to_date('25-03-2019', 'dd-mm-yyyy') to_dat from dual union all                                
  select 4 id, to_date('02-02-2019', 'dd-mm-yyyy') from_dat,  to_date('22-03-2019', 'dd-mm-yyyy') to_dat from dual union all                               
  select 5 id, to_date('14-02-2019', 'dd-mm-yyyy') from_dat,  to_date('25-02-2019', 'dd-mm-yyyy') to_dat from dual      
)

select id, from_dat, max(to_dat) from test_table
connect by nocycle
  PRIOR to_dat > from_dat     and 
  PRIOR from_dat < to_dat
group by id, from_dat
having max(to_dat) - from_dat > 30
order by id, from_dat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...