Direkt zum Hauptinhalt springen
eLearner.app
Modul 6 · Lektion 2 von 422/57 im Kurs~12 min
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, Format YYYY-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:

SpalteGeben Sieein
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (kann NULL sein)

EXTRACT – einen Teil lesen

EXTRACT(part FROM date) extrahiert eine Zahl:

SQL
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:

SQL
-- 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:

SQL
SELECT id,
       shipped_at - ordered_at AS wait_time
FROM   orders
WHERE  shipped_at IS NOT NULL;

Vergleiche mit einem INTERVAL-Literal:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

Tage zu einem Datum hinzufügen:

SQL
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM   customers;

Probieren Sie es aus

Übung#sql.m6.l2.e1
Versuche: 0Wird geladen…

Zählen Sie, wie viele Bestellungen pro Jahr aufgegeben wurden. Zwei Spalten: Jahr (Ganzzahl) und order_count. Sortierung nach Jahr aufsteigend.

Editor wird geladen…
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

Übung#sql.m6.l2.e2
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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