2013-04-25 86 views
6

我需要生成兩個給定日期之間的所有日期。只要只有一個日期範圍,這可以正常工作。但是,如果我有多個日期範圍,則此解決方案不起作用。我在這裏搜索以及在asktom,但找不到相關的指針/解決方案。在兩個日期之間生成日期

我嘗試了使用all_objects和CONNECT BY ROWNUM的解決方案,但沒有運氣。這是問題的聲明:sqlfiddle

輸入

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

輸出

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

此處還需要補充的一點是,_t_dates_表不是簡單的表格,而是一種複雜的表格,除了_ID_,_START_DATE_,_END_DATE_之外,還會帶來大量信息。 – Vishal 2013-04-25 08:58:42

回答

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

完美..謝謝。 – Vishal 2013-04-25 09:01:00

3

請嘗試:

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

試過這個解決方案,但這沒有奏效。我用一個複雜的表替換了t_dates表,結果集不正確。無論如何感謝您的幫助.. :) – Vishal 2013-04-25 09:19:47

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; 
相關問題