2013-04-25 48 views
6

Tôi cần tạo tất cả các ngày giữa hai ngày nhất định. Điều này làm việc tốt miễn là chỉ có một phạm vi ngày. Tuy nhiên, nếu tôi có nhiều phạm vi ngày, giải pháp này không hoạt động. Tôi đã tìm kiếm ở đây cũng như trên asktom, nhưng không thể xác định vị trí con trỏ có liên quan/giải pháp.Tạo ngày giữa hai ngày

Tôi đã thử cả hai giải pháp sử dụng all_objects và CONNECT BY ROWNUM, nhưng không có may mắn. Đây là báo cáo vấn đề: sqlfiddle

Input

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

Output

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

Một điều nữa cần thêm ở đây là bảng _t_dates_ không phải là bảng đơn giản thay vì bảng phức tạp mang nhiều thông tin ngoài _ID_, _START_DATE_, _END_DATE_. – Vishal

Trả lời

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

Chỉ cần hoàn hảo .. Cảm ơn. – Vishal

3

Vui lòng thử:

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

Đã thử giải pháp này, nhưng cách này không hiệu quả. Tôi đã thay thế bảng t_dates bằng một bảng phức tạp và resultset không thích hợp. Dù sao, nhờ sự giúp đỡ.. :) – 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; 
Các vấn đề liên quan