Datumswerte abhängig vom Sysdate

stera

Neuer Benutzer
Beiträge
3
Hallo zusammen,

ich bin neu hier und auch in dem Oracle-Thema und würde gerne mal die folgende Frage stellen:

Es wird eine SQL-Abfrage benötigt, die aus einer Transaktionstabelle die Datensätze monatsweise ausgibt, d.h. immer komplett den letzten vollen Monat oder die letzten beiden vollen Monate, etc. Unabhängig davon, ob die Auswertung am 01. des Folgemonats oder z.B. erst am 13. des Folgemonats ausgeführt wird.

In SQLServer könnte man das beispielsweise so lösen:

select * from Transaktionen
where Datediff(month,Transaktionsdatum,current_timestamp) = 1)


Ist sowas in der Art unter Oracle überhaupt möglich?
Ich habe schon etwas mit Trunc(Sysdate) herumexperimentiert, komme aber leider nicht wirklich weiter.

Vielen Dank im voraus für Eure Bemühungen :)
Steffen
 
Werbung:
Das geht mit add_months() und trunc()
Code:
select *
from transaktionen
where transaktionsdatum >= add_months(trunc(sysdate, 'month'), -1);

Das trunc wird benötigt, weil Oracle immer eine Uhrzeit speichert auch bei einer Spalte die als DATE definiert wurde. trunc() "normalisiert" die Uhrzeit auf Mitternacht.

Du musst bei Oracle aufpassen. SYSDATE liefert ein DATE zurück. CURRENT_TIMESTAMP liefert ein TIMESTAMP WITH TIME ZONE. Wenn transaktionsdatum nicht auch ein timestamp WITH time zone ist, dann kann das bei Uhrzeiten die es z.B. in der Winterzeit nicht gibt zu Fehlern führen.
 
Hallo,

vielen Dank, das funktioniert schonmal.
Allerdings habe ich da noch ein Verständnisproblem.
- Wenn ich im Code "transaktionsdatum >= add_months(trunc(sysdate, 'month'), -1)" verwende, erhalte ich zwar wie gewünscht alle Transaktionen des Vormonats, aber auch alles mit Transaktionsdatum im laufenden Monat.
- Wenn ich statt >= nur = verwende, erhalte ich als Ergebnis nur den ersten Tag des Vormonats.

Das Feld selbst ist als DateTime definiert.

Der o.g. Link hat mir bei dieser Fragestellung leider auch nicht weitergeholfen, oder habe ich da was übersehen?
Hat noch jemand einen Tipp für mich?
Vielen Dank!
 
- Wenn ich im Code "transaktionsdatum >= add_months(trunc(sysdate, 'month'), -1)" verwende, erhalte ich zwar wie gewünscht alle Transaktionen des Vormonats, aber auch alles mit Transaktionsdatum im laufenden Monat.

Dann musst Du noch ein < verwenden:

Code:
select *
from transaktionen
where transaktionsdatum >= add_months(trunc(sysdate, 'month'), -1)
  and transaktionsdatum < trunc(sysdate, 'month');
 
Werbung:
Zurück
Oben