Lektionen des Moduls (2/4)
Datums- und Timestamp-Funktionen
Datums- und Zeitstempel sind überall: Bestellungen, Anmeldungen, Ereignisse, Abrechnungen. In In dieser Lektion sehen wir, wie man Teile aus einem Datum (Jahr, Monat…) extrahiert. Auf eine Granularität (Monat, Woche…) kürzen, Intervalle berechnen und Unterschiede, und vergleichen Sie sie über mehrere Zeiträume hinweg.
Die Basistypen
PostgreSQL unterscheidet:
DATE– nur Datum, FormatYYYY-MM-DD;TIMESTAMP– Datum + Uhrzeit, keine Zeitzone;TIMESTAMPTZ– Datum + Uhrzeit + Zeitzone;INTERVAL– ein Punkt (z. B.'3 days','2 hours 30 minutes').
In unserem ecommerce-Datensatz:
| Spalte | Geben Sie | ein |
|---|---|---|
customers.signed_up_on | DATE | |
orders.ordered_at | TIMESTAMP | |
orders.shipped_at | TIMESTAMP (kann NULL sein) |
EXTRACT – einen Teil lesen
EXTRACT(part FROM date) extrahiert eine Zahl:
SELECT EXTRACT(YEAR FROM ordered_at) AS year,
EXTRACT(MONTH FROM ordered_at) AS month,
EXTRACT(DOW FROM ordered_at) AS day_of_week -- 0=domenica
FROM orders;Die am häufigsten verwendeten Teile: YEAR, MONTH, DAY, HOUR, MINUTE, DOW (Tag
der Woche 0-6), DOY (Tag des Jahres).
DATE_TRUNC – Abrunden
DATE_TRUNC('part', date) „kürzt“ das Datum auf eine Granularität. Es ist
unerlässlich für die Aggregation nach Monat, Woche, Stunde:
-- Tutti gli ordini fatti in "marzo 2025" cadono nello stesso bucket:
SELECT DATE_TRUNC('month', ordered_at) AS month,
COUNT(*) AS order_count
FROM orders
GROUP BY month
ORDER BY month;Gültige Teile: 'year', 'quarter', 'month', 'week', 'day',
'hour', 'minute', 'second'.
Aus Gründen der Lesbarkeit wird oft in DATE umgewandelt, wenn keine Zeit benötigt wird:
DATE_TRUNC('month', ordered_at)::date.
Unterschiede und Intervalle
Das Subtrahieren zweier TIMESTAMPs ergibt einen INTERVAL:
SELECT id,
shipped_at - ordered_at AS wait_time
FROM orders
WHERE shipped_at IS NOT NULL;Vergleiche mit einem INTERVAL-Literal:
WHERE shipped_at - ordered_at > INTERVAL '1 day'Tage zu einem Datum hinzufügen:
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM customers;Probieren Sie es aus
Zählen Sie, wie viele Bestellungen pro Jahr aufgegeben wurden. Zwei Spalten: Jahr (Ganzzahl) und order_count. Sortierung nach Jahr aufsteigend.
Hinweis anzeigen
EXTRACT(YEAR FROM order_at) gibt einen NUMERIC-Wert zurück: Wandeln Sie ihn zur besseren Lesbarkeit mit ::int in int um.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Zeigen Sie für jeden Monat des Jahres 2024 den ersten Tag des Monats (Spalte Monat, vom Typ Datum) und die Anzahl der Bestellungen an. Bestellen Sie nach Monat.
Hinweis anzeigen
DATE_TRUNC('month', order_at) gibt den ersten Tag des Monats als Zeitstempel zurück; ::date wandelt es in ein Datum um.
Lösung nach 3 Versuchen verfügbar