2011-08-03 14 views

Trả lời

17

Something như thế này

SQL> ed 
Wrote file afiedt.buf 

    select to_char(add_months(start_date, level-1), 'fmMonth') 
     from (select date '2011-03-30' start_date, 
        date '2011-06-29' end_date 
       from dual) 
    connect by level <= months_between(
          trunc(end_date,'MM'), 
          trunc(start_date,'MM')) 
    *      + 1 
SQL>/

TO_CHAR(ADD_MONTHS(START_DATE,LEVEL- 
------------------------------------ 
March 
April 
May 
June 

nên làm việc.

+1

Xin chào Justin, những người tuyệt vời nghĩ như nhau;) – APC

+0

+1. "giống nhau" nhưng của bạn là - như bạn đã chỉ ra - tốt hơn. : D – APC

+1

Vâng, ngay cả một con sóc mù tìm thấy các hạt thường xuyên. –

1

Bạn có thể sử dụng chức năng MONTHS_BETWEEN

SELECT MOD(TRUNC(MONTHS_BETWEEN('2011-07-29', '2011-03-28')), 12) as MONTHS 
FROM DUAL 

Output

MONTHS 
---------- 
     4 
+0

tôi cần những tháng như sản lượng, tức là. Tháng 3, tháng 4, tháng 5 và tháng 6. Không 4. – Nitish

+0

Xin lỗi, tôi đã hiểu lầm câu hỏi của bạn. Bạn nên kiểm tra câu trả lời của Justin Cave. Đung vậy. – bruno

1

Tôi cần câu trả lời cho điều này một vài ngày trước. Tôi đã tìm thấy một giải pháp khác mà tôi thích hơn:

select to_char(which_month, 'Mon-yyyy') month 
from 
(
    select 
     add_months(to_date(:start_date,'mm-yyyy'), rownum-1) which_month 
    from 
     all_objects 
    where 
     rownum <= months_between(to_date(:end_date,'mm-yyyy'), add_months(to_date(:start_date,'mm-yyyy'), -1)) 
    order by 
     which_month 
) 

Tất nhiên bạn có thể sử dụng bất kỳ định dạng nào bạn muốn. Tôi 'union'ed và tổng kết hơn một bộ khác để tôi có được những tháng ngay cả khi họ không có kết quả.

+0

Được đánh giá cao, trả lời chính xác những gì tôi muốn :) – John

1

Gonna thêm giải pháp này chỉ vì tôi nghĩ rằng nó sạch hơn nhiều so với những người khác:

SELECT ADD_MONTHS(TRUNC(TO_DATE('28-Mar-2011', 'DD-MON-YYYY'), 'MON'), ROWNUM - 1) date_out 
FROM DUAL 
CONNECT BY ADD_MONTHS(TRUNC(TO_DATE('28-Mar-2011', 'DD-MON-YYYY'), 'MON'), ROWNUM - 1) 
    <= TRUNC(TO_DATE('29-Jun-2011', 'DD-MON-YYYY'), 'MON') 
0
SELECT MIN (to_date((TO_CHAR (Actual_Date, 'DD-MM-RRRR')),'dd-mm-rrrr')) F_DATE, 
     MAX (to_date((TO_CHAR (Actual_Date, 'DD-MM-RRRR')),'dd-mm-rrrr')) T_DATE, 
     TO_CHAR (Actual_Date, 'MM-RRRR') TRX_MONTH  
    FROM ( SELECT TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr')) + LEVEL - 1 
         Actual_Date 
       FROM (SELECT TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr'), 'MM') - 1 
           AS dt 
         FROM DUAL) 
      CONNECT BY LEVEL <= 
         ( TO_DATE (:P_TDATE, 'dd-mm-rrrr') 
         - TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr')) 
         + 1)) 
GROUP BY TO_CHAR (Actual_Date, 'MM-RRRR') 
ORDER BY 1 
+0

Vui lòng thụt lề mã của bạn bằng 4 dấu cách để kích hoạt đánh dấu cú pháp. Ngoài ra, thêm một chút giải thích văn bản thường được đánh giá cao (đặc biệt là nếu có câu trả lời được chấp nhận, hãy nói những gì giải pháp của bạn làm cho khác nhau). – chtz

Các vấn đề liên quan