2011-08-03 9 views

Odpowiedz

17

coś takiego

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 

powinno działać.

+1

Witaj Justin, wielkie umysły myślą podobnie;) – APC

+0

+1. "podobni", ale twój jest - jak zauważyłeś - lepszy. : D – APC

+1

Cóż, nawet ślepa wiewiórka znajduje sporadyczny orzech. –

1

Można użyć funkcji MONTHS_BETWEEN

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

wyjście

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

muszę miesiące jak wyjścia, tj. Marzec, kwiecień, maj i czerwiec. Nie 4. – Nitish

+0

Niestety, źle zrozumiałem twoje pytanie. Powinieneś sprawdzić odpowiedź Justina Cave'a. Jest poprawna. – bruno

1

Potrzebowałem odpowiedzi na to kilka dni temu. Znalazłem inne rozwiązanie, które mi się podobało:

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 
) 

Można oczywiście użyć dowolnego formatu. Połączyłem się i podsumowałem kolejny zestaw, aby uzyskać miesiące, nawet jeśli nie przyniosły rezultatów.

+0

Doceniona, dokładna odpowiedź, co chcę :) – John

1

Zamierzam dodać tego rozwiązania tylko dlatego myślę, że to znacznie czystsze niż inni:

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

Wprowadź wcięcie kodu przez 4 spacje, aby aktywować podświetlanie składni. Dodaje się również trochę tekstu wyjaśniającego (zwłaszcza jeśli są już zaakceptowane odpowiedzi, powiedz, co twoje rozwiązanie robi inaczej). – chtz

Powiązane problemy