select -- Last month period trunc(sysdate, 'mm') - interval '1' month last_month_start, trunc(sysdate, 'mm') - interval '1' second last_month_end, -- Last week period trunc(sysdate, 'iw') - interval '7' day last_week_start, trunc(sysdate, 'iw') - interval '1' second last_week_end, -- Last day period trunc(sysdate, 'dd') - interval '1' day last_day_start, trunc(sysdate, 'dd') - interval '1' second last_day_end from dual
Mit diesem SQL-Statement werden ermittelt:
- der letzte Monat,
- die letzte Woche und
- Gestern
Und zwar jeweils der Anfang und das Ende des Zeitraumes (letzte Sekunde).
LAST_MONTH_START LAST_MONTH_END ----------------- ----------------- 01.02.17 00:00:00 28.02.17 23:59:59 LAST_WEEK_START LAST_WEEK_END ----------------- ----------------- 20.03.17 00:00:00 27.03.17 23:59:59 LAST_DAY_START LAST_DAY_END ----------------- ----------------- 28.03.17 00:00:00 28.03.17 23:59:59
Update vom 05.04.2017:
Abfrage angepasst nach Hinweis von Jürgen Sieben. Dankeschön. ^^
8 Antworten auf „SQL: Gestern, letzte Woche, letzter Monat“
Hallo Markus,
stimmt, aber so machte man das, mit Verlaub, in den 90er Jahren. Seit Version 9 der Datenbank geht es auch so:
select trunc(sysdate, ‘MM’) – interval ‘1’ month monat_von,
trunc(sysdate, ‘MM’) – interval ‘1’ second monat_bis
from dual;
Warum ist nicht endlich einmal Schluss mit der Verwendung dieser alten Magic Numbers? 7 + 86399/86400 ? Ernsthaft?
Dann ist mein Vorschlag ja abwärtskompatibel bis Oracle 8i, na wenn das nix ist? 😉
Nein ernsthaft, Danke für Deinen Hinweis Jürgen. Die Variante ist natürlich eleganter. Habe meinen Beitrag angepasst.
Habt Ihr auch eine Idee für halbmonatlich?
Also, bin heute am 13.08. und möchte als Ergebnis den letzten halben Montag geliefert bekommen, nämlich 16.07. – 31.07.
Moin Jungs, gibt es auch halbmonatlich?
Also: Heute am 14.08.2018 möchte ich als Ergebnis den 16.07.18 bis 31.07.2018 bekommen.
Danke für Eure Nachricht.
Das wäre z. B. so umsetzbar:
Ergebnis:
In diesem Beispiel wechselt die Monatshälfte immer am 16. Tag – auch im Monat Februar. Das Problem wäre aber auch noch lösbar.
Sensationell, 1000 Dank…. ich bin überwältigt.
Gerne immer wieder.
Schönen Tag aus Bielefeld.
LG
Vielen Dank für den Tipp! 🙂
Mit meiner ursprünglichen Idee hapert es leider beim jahres-Übergang KW52/53 -> 01:
WHERE –alle Tage der Vorwoche:
TO_NUMBER(TO_CHAR(dt, ‘IW’)) =
TO_NUMBER(TO_CHAR(SYSDATE, ‘IW’)) -1
Viele Grüße
Kai
Gerne. 🙂 Freut mich, dass ich helfen konnte.