2013-04-25 82 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; 
相关问题