CodeGym /Kurse /SQL SELF /Teile eines Datums extrahieren: EXTRACT() und AGE()

Teile eines Datums extrahieren: EXTRACT() und AGE()

SQL SELF
Level 31 , Lektion 2
Verfügbar

Heute tauchen wir wieder tiefer in die Manipulation von Zeitdaten ein und lernen, wie man daraus gezielt bestimmte Teile (zum Beispiel Jahr, Monat oder Wochentag) mit der Funktion EXTRACT() extrahiert. Außerdem schauen wir uns an, wie man mit AGE() das Alter oder Zeitintervalle zwischen Daten berechnet.

Im echten Projektalltag musst du oft bestimmte Teile eines Datums oder einer Uhrzeit rausziehen. Zum Beispiel:

  • Bestellungen nach Jahren oder Monaten aufteilen;
  • Zählen, wie viele User sich an einem bestimmten Wochentag registriert haben;
  • Analysieren, wie lange es zwischen zwei Events gedauert hat.

Für solche Aufgaben nutzen wir die Funktionen EXTRACT() und AGE().

Was ist EXTRACT()?

Mit EXTRACT() kannst du gezielt Teile eines Datums oder Zeitstempels rausziehen. Zum Beispiel das Jahr aus dem Geburtsdatum, die Monatsnummer oder sogar den Wochentag.

Syntax:

EXTRACT(part FROM source)
  • part: Der Teil des Datums, den du extrahieren willst. Das kann YEAR, MONTH, DAY, HOUR, MINUTE, SECOND und mehr sein.
  • source: Der Zeitdatentyp, aus dem du die Info ziehst. Das kann eine Spalte, eine Konstante oder das Ergebnis einer Funktion sein.

Beispiel 1: Jahr, Monat und Tag extrahieren

SELECT
    EXTRACT(YEAR FROM '2024-11-15'::DATE) AS jahr_teil,
    EXTRACT(MONTH FROM '2024-11-15'::DATE) AS monat_teil,
    EXTRACT(DAY FROM '2024-11-15'::DATE) AS tag_teil;

Ergebnis:

jahr_teil monat_teil tag_teil
2024 11 15

Hier haben wir Jahr, Monat und Tag aus dem Datum 2024-11-15 rausgezogen. Das ist praktisch, wenn du Daten nach bestimmten Datumsteilen gruppieren willst.

Beispiel 2: Wochentag und Stunde aus Zeit

SELECT
    EXTRACT(DOW FROM '2024-11-15'::DATE) AS wochentag,
    EXTRACT(HOUR FROM '15:30:00'::TIME) AS stunde_teil;

Ergebnis:

wochentag stunde_teil
3 15
  • DOW (Day of Week) gibt die Nummer des Wochentags zurück: Sonntag — 0, Montag — 1 usw.
  • HOUR zieht die Stunde aus der Zeit raus.

Beispiel 3: Anwendung auf Spalten

Wenn du eine Tabelle mit Daten hast, kannst du Teile davon für Analysen extrahieren. Angenommen, wir haben eine Tabelle orders:

order_id order_date
1 2023-05-12 14:20
2 2023-06-18 10:45
3 2023-07-22 21:15
SELECT
    order_id,
    EXTRACT(MONTH FROM order_date) AS monat,
    EXTRACT(DAY FROM order_date) AS tag
FROM orders;

Ergebnis:

order_id monat tag
1 5 12
2 6 18
3 7 22

Was ist AGE()?

Mit AGE() berechnest du die Differenz zwischen zwei Zeitstempeln. Zum Beispiel kannst du damit das Alter eines Kunden anhand seines Geburtsdatums berechnen oder herausfinden, wie viel Zeit seit einer Bestellung vergangen ist.

Syntax:

AGE(timestamp1, timestamp2)
  • timestamp1: Der spätere Zeitstempel.
  • timestamp2: Der frühere Zeitstempel.
  • Wenn du nur einen Parameter angibst, vergleicht PostgreSQL ihn automatisch mit dem aktuellen Datum (NOW()).

Beispiel 1: Alter berechnen

SELECT AGE('2025-11-15'::DATE, '1990-05-12'::DATE) AS alter;

Ergebnis:

alter
35 years 6 mons

Dieses Beispiel zeigt das Alter einer Person, die am 12. Mai 1990 geboren wurde, am 15. November 2025.

Beispiel 2: Zeitintervall zwischen Events

SELECT AGE('2023-06-01 15:00'::TIMESTAMP, '2023-05-20 10:30'::TIMESTAMP) AS dauer;

Ergebnis:

dauer
11 days 4:30:00

Hier haben wir das Zeitintervall zwischen zwei Events berechnet. Das ist praktisch, wenn du wissen willst, wie viel Zeit zwischen Start und Ende einer Aufgabe vergangen ist.

Beispiel 3: Alter eines Kunden

Angenommen, wir haben eine Tabelle customers:

customer_id birth_date
1 1992-03-10
2 1985-07-07

Wir können das Alter der Kunden berechnen:

SELECT
    customer_id,
    AGE(NOW(), birth_date) AS alter
FROM customers;

Ergebnis am 13. Juni 2025:

customer_id alter
1 33 years 3 mons
2 39 years 11 mons

Klar, bei dir wird NOW() einen anderen Wert haben und das Ergebnis ist dann entsprechend anders.

Praktische Beispiele für EXTRACT() und AGE()

Jetzt kombinieren wir die Funktionen in echten Szenarien.

Beispiel 1: Daten nach Monaten gruppieren

Angenommen, wir haben eine Bestelltabelle mit Daten. Um Bestellungen pro Monat zu zählen, nimmst du folgendes Statement:

SELECT
    EXTRACT(MONTH FROM order_date) AS bestell_monat,
    COUNT(*) AS gesamt_bestellungen
FROM orders
GROUP BY bestell_monat
ORDER BY bestell_monat;

Beispiel 2: Tage bis zum Ablaufdatum

Stell dir vor, es gibt eine Tabelle subscriptions:

subscription_id expiry_date
1 2023-12-31
2 2024-05-15

Wir wollen wissen, wie viele Tage bis zum Ablauf des Abos bleiben:

SELECT
    subscription_id,
    AGE(expiry_date, NOW()) AS verbleibende_zeit
FROM subscriptions;

Ergebnis:

subscription_id verbleibende_zeit
1 1 mons 15 days
2 6 mons

Typische Fehler und wie du sie vermeidest

Beim Einsatz von EXTRACT() und AGE() stolpern Einsteiger manchmal über folgende Stolpersteine:

  • Du versuchst, einen nicht erlaubten Teil zu extrahieren, zum Beispiel Monate aus dem Typ TIME. Merke: YEAR, MONTH und DAY funktionieren mit DATE, TIMESTAMP, aber nicht mit TIME.
  • Probleme mit unterschiedlichen Zeitdaten-Formaten. Zum Beispiel wird der String 2023/11/15 nicht als Datum erkannt. Nutze Type-Casting mit ::DATE oder TO_DATE().
  • Unterschied zwischen AGE() und dem Subtrahieren von Zeitstempeln. Wenn du ein genaues Intervall (in Monaten, Tagen, Sekunden) brauchst — nimm AGE(). Für die reine Anzahl der Tage reicht eine einfache Subtraktion.

Jetzt hast du alles am Start, um Teile von Zeitdaten in PostgreSQL zu extrahieren und zu analysieren. Probier EXTRACT() und AGE() ruhig mal in deinen eigenen Projekten aus!

2
Aufgabe
SQL SELF, Level 31, Lektion 2
Gesperrt
Berechnung des Alters der Kunden zum aktuellen Datum
Berechnung des Alters der Kunden zum aktuellen Datum
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION