2016-09-08 3 views
1

Ich habe unten Abfrage geschrieben, um eine Datumssequenz zu generieren, in der Datumsbereiche 12 Monate umfassen und Der erste Datumsbereich beginnt mit der Spalte von_Datum und endet mit TO_DATE. zum Beispiel für from_date ITP_no 1 1-Apr-07 und to_date 31-Mar-09 dann shoud op ITP_NO 1. April 2007- März 2008 1. April 2008- MAR 2009Wie generiere ich Datumsbereiche in SQL, vorausgesetzt, To_date to to_date von einer gegebenen Tabelle?

Below is input table 

ITP_NO BILL_AMOUNT FROM_DATE TO_DATE 
1 58  1-Apr-07   31-Mar-08 
1 58  1-Apr-07   31-Mar-08 
1 58  1-Apr-07   31-Mar-08 
1 58  1-Apr-07   31-Mar-08 
1 58  1-Apr-07   31-Mar-08 
1 116  1-Jan-09   31-Dec-11 

Abfrage sein:

SELECT ITP_NO ,level, 
      BILL_AMOUNT ,From_Date,TO_DATE, 
TO_CHAR(ADD_MONTHS(From_Date, (LEVEL - 1) * 12), 'MON-YYYY') || ' - '|| 
TO_CHAR(ADD_MONTHS(From_Date, LEVEL * 12)-1, 'Mon-YYYY') as End_Date 
FROM (
      SELECT ITP_NO, 
         BILL_AMOUNT, 
         From_Date, 
         TO_DATE 
      FROM test123 

    ) 
CONNECT BY ADD_MONTHS(From_Date, (LEVEL - 1) * 12)<TO_DATE 

Ausgang gegeben durch:

ITP_NO LEVEL BILL_AMOUNT FROM_DATE TO_DATE  END_DATE 



1 1 58  1-Apr-07 31-Mar-08 Apr-07-Mar-08 
1 1 58  1-Apr-07 31-Mar-08 Apr-07-Mar-08 
1 1 58  1-Apr-07 31-Mar-08 Apr-07-Mar-08 
1 1 58  1-Apr-07 31-Mar-08 Apr-07-Mar-08 
1 1 58  1-Apr-07 31-Mar-08 Apr-07-Mar-08 
1 2 116  1-Jan-09 31-Dec-11 Jan-10-Dec-10 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 2 116  1-Jan-09 31-Dec-11 Jan-10-Dec-10 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 2 116  1-Jan-09 31-Dec-11 Jan-10-Dec-10 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 3 116  1-Jan-09 31-Dec-11 Jan-11-Dec-11 
1 2 116  1-Jan-09 31-Dec-11 Jan-10-Dec-10 

e RWARTETE O/P

ITP_NO BILL_AMOUNT FROM_DATE TO_DATE END_DATE   
1 58 1-Apr-07 31-Mar-08 Apr-07- Mar-08 
1 58 1-Apr-07 31-Mar-08 Apr-07- Mar-08 
1 58 1-Apr-07 31-Mar-08 Apr-07- Mar-08 
1 58 1-Apr-07 31-Mar-08 Apr-07- Mar-08 
1 58 1-Apr-07 31-Mar-08 Apr-07- Mar-08 
1 116 1-Jan-09 31-Dec-11 Jan-09- Dec-10 
1 116 1-Jan-09 31-Dec-11 Jan-11- Dec-11 
+0

Stehen Sie mit MySQL oder Oracle? (Markieren Sie keine Produkte, die nicht beteiligt sind.) – jarlh

+0

@jarlh M unter Verwendung von Oracle 10G – KD29

+0

Warum möchten Sie so viele Datensätze für ITP_NO 58 .. der Datensatz ist nur Duplikate. Versuchen Gruppierung von und die Reihenfolge von Enddatum – XING

Antwort

0

Ich denke, dass so etwas wie hier nützlich sein kann. In row_number() in innerer Abfrage und verwenden Sie es in connect by Klausel:

select t.*, 
     to_char(add_months(From_Date, (level - 1) * 12), 'yyyy-mm') || ' - '|| 
     to_char(add_months(From_Date, (level * 12)) - 1, 'yyyy-mm') period 
    from (
    select t.*, row_number() over (order by from_date, to_date) rn 
     from test123 t) t 
    connect by add_months(From_Date, (level - 1) * 12) <= to_date 
      and prior rn = rn and prior dbms_random.value is not null 

Es ist der Unterschied in der Ausgabe und ich für 116, aber das ist 3 Jahre Zeit.

Der Teil prior rn = rn and prior dbms_random.value is not null ist der Trick, der in hierarchischen Abfragen verwendet wird, um ORA-01436: CONNECT BY loop in user data zu verhindern.

Oracle Row Generator Techniques

Test:

create table test123 (itp_no number(3), bill_amount number(6), from_date date, to_date date); 
insert into test123 values (1, 58, date '2007-04-01', date '2008-03-31'); 
insert into test123 values (1, 58, date '2007-04-01', date '2008-03-31'); 
insert into test123 values (1, 58, date '2007-04-01', date '2008-03-31'); 
insert into test123 values (1, 58, date '2007-04-01', date '2008-03-31'); 
insert into test123 values (1, 58, date '2007-04-01', date '2008-03-31'); 
insert into test123 values (1, 116, date '2009-01-01', date '2011-12-31'); 


ITP_NO BILL_AMOUNT FROM_DATE TO_DATE    RN PERIOD 
------ ----------- ----------- ----------- ---------- ----------------- 
    1   58 2007-04-01 2008-03-31   1 2007-04 - 2008-03 
    1   58 2007-04-01 2008-03-31   2 2007-04 - 2008-03 
    1   58 2007-04-01 2008-03-31   3 2007-04 - 2008-03 
    1   58 2007-04-01 2008-03-31   4 2007-04 - 2008-03 
    1   58 2007-04-01 2008-03-31   5 2007-04 - 2008-03 
    1   116 2009-01-01 2011-12-31   6 2009-01 - 2009-12 
    1   116 2009-01-01 2011-12-31   6 2010-01 - 2010-12 
    1   116 2009-01-01 2011-12-31   6 2011-01 - 2011-12 
Verwandte Themen