Kategorien
Allgemein

SQL: Gestern, letzte Woche, letzter Monat

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.  ^^

Von Markus Hohloch

Selbständiger Berater für Softwareentwicklung und Informationstechnik. Schwerpunkte sind die Entwicklung von Web-Applikationen mit Oracle APEX oder Java und Jasper Reports.

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:

select
  example_date,  
  case when to_number(to_char(example_date, 'dd')) <= 15
    then trunc(example_date, 'mm') - interval '1' month + interval '15' day
    else trunc(example_date, 'mm')
  end half_month_start,
  case when to_number(to_char(example_date, 'dd')) <= 15
    then trunc(example_date, 'mm') - interval '1' second
    else trunc(example_date, 'mm') + interval '14' day
  end half_month_end  
from (
  -- Beispieldaten für August 2018
  select to_date('14.08.2018','dd.mm.yyyy') + rownum - 1 example_date
  from dual
  connect by level <= to_date('17.08.2018','dd.mm.yyyy') - to_date('14.08.2018','dd.mm.yyyy') + 1
);

Ergebnis:

EXAMPLE  HALF_MON HALF_MON
-------- -------- --------
14.08.   16.07.   31.07.
15.08.   16.07.   31.07.
16.08.   01.08.   15.08.
17.08.   01.08.   15.08.

In diesem Beispiel wechselt die Monatshälfte immer am 16. Tag – auch im Monat Februar. Das Problem wäre aber auch noch lösbar.

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite ist durch reCAPTCHA und Google geschütztDatenschutz-Bestimmungen UndNutzungsbedingungen anwenden.

The reCAPTCHA verification period has expired. Please reload the page.