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

6 Gedanken zu „SQL: Gestern, letzte Woche, letzter Monat

  1. 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?

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

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

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

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

Schreibe einen Kommentar

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