2013-04-25 14 views
6

Ich muss alle Daten zwischen zwei angegebenen Daten generieren. Dies funktioniert, solange es nur einen Datumsbereich gibt. Wenn ich mehrere Datumsbereiche habe, funktioniert diese Lösung jedoch nicht. Ich habe sowohl hier als auch auf Nachfrage gesucht, konnte aber keine relevanten Hinweise/Lösungen finden.Generieren von Daten zwischen zwei Daten

Ich habe versucht beide Lösungen mit all_objects und CONNECT BY ROWNUM, aber kein Glück. Hier ist die Problemstellung: sqlfiddle

Eingang

ID START_DATE  END_DATE 
101 April, 01 2013 April, 10 2013 
102 May, 10 2013 May, 12 2013 

Ausgabe

ID Dates 
101 April, 01 2013 
101 April, 02 2013 
101 April, 03 2013 
101 April, 04 2013 
101 April, 05 2013 
101 April, 06 2013 
101 April, 07 2013 
101 April, 08 2013 
101 April, 09 2013 
101 April, 10 2013 
102 May, 10 2013 
102 May, 11 2013 
102 May, 12 2013 
+0

Eine weitere Sache, die hier hinzugefügt werden kann, ist, dass _t_dates_ table nicht diese einfache Tabelle ist, sondern eine komplexe, die viele Informationen mit sich bringt, abgesehen von _ID_, _START_DATE_, _END_DATE_. – Vishal

Antwort

6
select 
    A.ID, 
    A.START_DATE+delta dt 
from 
    t_dates A, 
    (
    select level-1 as delta 
    from dual 
    connect by level-1 <= (
     select max(end_date - start_date) from t_dates 
    ) 
) 
where A.START_DATE+delta <= A.end_date 
order by 1, 2 
+0

Einfach perfekt .. Danke. – Vishal

3

Bitte versuchen:

select 
    distinct ID, 
    START_DATE+level-1 DATES 
from dual a, TABLE_DATES b 
connect by level <= (END_DATE-START_DATE)+1 
order by ID; 
+0

versuchte diese Lösung, aber das hat nicht funktioniert. Ich habe die Tabelle t_dates durch eine komplexe Tabelle ersetzt, und das Resultset ist nicht korrekt. Wie auch immer, danke für die Hilfe .. :) – Vishal

1
select g.cycle_dt 
     from 
      (select to_date(d,'DD-MM-YYYY') cycle_dt 
       from dual 
        model 
        dimension by (trunc(to_date('30092015', 'DDMMYYYY')) d) 
        measures (0 y) 
        rules (
        y[for d from trunc(to_date('30092015', 'DDMMYYYY')) to to_date('30102015', 'DDMMYYYY') increment 1]=0 
        )) g 
     order by g.cycle_dt;