2013-03-18 3 views
1

Мне нужно найти промежутки между DateRanges базового и тестового диапазонов с использованием sql.here есть мой пример SD и ED - это начальные и конечные даты. все строки для A и B находятся в одной таблице.Найти пробелы в диапазонах дат с использованием sql в Oracle

датировать в

ID SD   ED 
A 20130101  20130531 
A 20130601  20131031 

Дата Б

ID SD   ED 
B 20130120  20130420 
B 20130601  20130830 
B 20130910  20131130 
Output should be: 
the Dates that are in A but are not in B with no dates overlaps 

Отсутствующие Gap Диапазоны

SD   ED 
20130101  20130119 
20130421  20130531 
20130831  20130909 

я посмотрел на некоторые примеры здесь http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:529176000346581356 но они не сценарий, как у меня.

ответ

2
select 
    to_char(SD, 'yyyymmdd') as SD, 
    to_char(ED, 'yyyymmdd') as ED 
from 
    ( -- prepare gaps in each A after removing all B 
     select 
     BED + 1 as SD, 
     lead(BSD, 1, AED + 1) over (partition by ASD,AED order by BSD) - 1 as ED 
     from 
     ( -- prepare all intersections between A and B 
      select AA.sd as ASD, AA.ed as AED, BB.sd as BSD, BB.ed as BED 
      from AA join BB on least(AA.ed, BB.ed) >= greatest(AA.sd, BB.sd) 
      union all 
      select AA.sd, AA.ed, to_date('1000','yyyy'), AA.sd - 1 
      from AA 
     ) 
    ) 
where SD <= ED -- exclude empty gaps 
order by 1 

fiddle

+0

это здорово. Большое спасибо!!!!. мои данные целые, а не дата в Db и в одной таблице, можете ли вы добавить комментарии к этому в отношении того, что делает то, что здесь, его довольно классный sql, но не уверен, как его работа –

+1

@NatashaThapa - конвертировать число на сегодняшний день: ' to_date (число, 'yyyymmdd') ', чтобы преобразовать дату в число:' to_number (to_char (date, 'yyyymmdd)) ' –

+0

не могли бы вы добавить некоторые комментарии относительно того, что делает каждый раздел sql, если мне нужно изменить –

Смежные вопросы