PL/SQL Datum in For...Next-Schleife?

Ookami

Neuer Benutzer
Beiträge
1
Hallo,
ich habe folgendes Problem.
Ich möchte aus einem Cursor von einem Datum zum Beispiel vom 01.01.14 bis zum 03.01.14 jeweils "Tagesabfragen" machen und über den Befehl dbms_output.put_line ausgeben lassen.

Quasi so:

01.01.14// Vormittagsfahrten: 12
01.01.14//Nachmittagsfahrten: 10
**********************
02.01.14 // Vormittagsfahrten: 6
02.01.14//Nachmittagsfahrten: 4
**********************
03.01.14// Vormittagsfahrten: 1
03.01.14//Nachmittagsfahrten: 4
**********************


Mein Lösungsansatz sieht wie folgt aus:

Set serveroutput on
DECLARE
StartD Date := 01.01.14
EndD Date := 03.01.14
Cursor Test_Cursor is
Select *
FROM Testtable
BEGINN
For i = StartD to EndD
dbms_output.put_line ( Date//'Vormittagsfahrten:'//(SELECT COUNT...)
dbms_output.put_line ( Date//'Nachmittagsfahrten:'//(SELECT COUNT...)
dbms_output.put_line ('*************************')
next i
EXIT WHEN Date (03.01.2014);
END
/



Ich würde einfach gerne wissen wie man das am elegantesten Abfragen kann, weil meine Idee klappt nicht :(

Gruß Ookami
 
Werbung:
Hallo,
ich habe folgendes Problem.
Ich möchte aus einem Cursor von einem Datum zum Beispiel vom 01.01.14 bis zum 03.01.14 jeweils "Tagesabfragen" machen und über den Befehl dbms_output.put_line ausgeben lassen.


Ich würde einfach gerne wissen wie man das am elegantesten Abfragen kann, weil meine Idee klappt nicht :(

Gruß Ookami

Wenn ich Dich richtig verstehe, hast Du:

Code:
test=# select * from foo;
  datum  | val
------------+-----
 2014-10-28 |  2
 2014-10-28 |  3
 2014-10-29 |  1
 2014-10-29 |  2
 2014-10-29 |  12
 2014-10-30 |  12
(6 rows)

und willst nun wissen, wie oft ein Ereignis je Tag auftritt. Das kann man wahnsinnig kompliziert mit Cursorn und Stored Procedures machen und da noch ganz viel Hexenwerk einbringen, es ginge aber auch so:

Code:
test=*# select datum, count(1) from foo group by datum;
  datum  | count
------------+-------
 2014-10-28 |  2
 2014-10-29 |  3
 2014-10-30 |  1
(3 rows)
 
@akretschmer:
Inwiefern kommt da das richtige Ergebnis raus ?
Sollte es nicht pro Datum 2 Mengen geben ? (Vormittags, Nachmittags)

@Ookami:

Code:
Select *
From   t;

       DATUM    FAHRT    ANZAHL
1    30.10.2014    Vormittag    2
2    30.10.2014    Nachmittag    0
3    31.10.2014    Vormittag    7
4    31.10.2014    Nachmittag    12
5    01.11.2014    Nachmittag    12
6    01.11.2014    Vormittag    1
7    02.11.2014    Nachmittag    2
8    02.11.2014    Vormittag    8
9    03.11.2014    Nachmittag    8
10    03.11.2014    Vormittag    0
11    04.11.2014    Nachmittag    3
12    04.11.2014    Vormittag    7
13    05.11.2014    Nachmittag    4
14    05.11.2014    Vormittag    22
15    06.11.2014    Nachmittag    19
16    06.11.2014    Vormittag    1000
17    07.11.2014    Nachmittag    0
18    07.11.2014    Vormittag    12
19    08.11.2014    Nachmittag    1
20    08.11.2014    Vormittag    5
21    09.11.2014    Nachmittag    0
22    09.11.2014    Vormittag    14

Da wir keine Ausgangsdaten haben, mach ich mir eben meine eigenen :p

Und hier dann die Prozedur:
Code:
Procedure temporary_prod is
      start_ Date := trunc(sysdate);
      end_ Date := trunc(sysdate) +4;
  
      Cursor anzahl_fahrten(p_date_ Date) is
         Select *
         From   t
         Where  trunc(datum) = p_date_
         Order by fahrt desc;

      rc_data anzahl_fahrten%rowtype;
   Begin
      For i in 0 .. (end_ - start_) loop
         Open anzahl_fahrten(start_ + i);
         Loop
            Fetch anzahl_fahrten Into rc_data;
            Exit When anzahl_fahrten%notfound;
        
            dbms_output.put_line(to_char(rc_data.datum, 'YYYY-MM-DD') || '//' || rc_data.fahrt || 'sfahrten: ' || to_char(rc_data.anzahl));
         End Loop;
         Close anzahl_fahrten;
         dbms_output.put_line('*****************************');
      end loop;
   End;

Und das Ergebnis:

Code:
2014-10-30//Vormittagsfahrten: 2
2014-10-30//Nachmittagsfahrten: 0
*****************************
2014-10-31//Vormittagsfahrten: 7
2014-10-31//Nachmittagsfahrten: 12
*****************************
2014-11-01//Vormittagsfahrten: 1
2014-11-01//Nachmittagsfahrten: 12
*****************************
2014-11-02//Vormittagsfahrten: 8
2014-11-02//Nachmittagsfahrten: 2
*****************************
2014-11-03//Vormittagsfahrten: 0
2014-11-03//Nachmittagsfahrten: 8
*****************************

Und wie @akretschmer schon sagte. . . Ein einfaches Select wäre hier sinnvoller!
 
Werbung:
Zurück
Oben