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 kannYEAR,MONTH,DAY,HOUR,MINUTE,SECONDund 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 —1usw.HOURzieht 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,MONTHundDAYfunktionieren mitDATE,TIMESTAMP, aber nicht mitTIME. - Probleme mit unterschiedlichen Zeitdaten-Formaten. Zum Beispiel wird der String
2023/11/15nicht als Datum erkannt. Nutze Type-Casting mit::DATEoderTO_DATE(). - Unterschied zwischen
AGE()und dem Subtrahieren von Zeitstempeln. Wenn du ein genaues Intervall (in Monaten, Tagen, Sekunden) brauchst — nimmAGE(). 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!
GO TO FULL VERSION