Datumsangaben abschneiden und gruppieren
Mit DATE_TRUNC und entsprechenden Funktionen nach Woche, Monat und Quartal gruppieren.
Datumsangaben abschneiden und gruppieren ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Warum das Gruppieren von Datumsangaben abgefragt wird
„Umsatz nach Woche“ oder „aktive Benutzer nach Monat“ gehören zum Standardrepertoire von Analysteninterviews. Dabei wird geprüft, ob Sie präzise Zeitstempel in einen gröberen Bucket überführen können, sodass die Zeilen gemeinsam gruppiert werden.
Ein häufiger Fehler von Berufseinsteigern besteht darin, nur die Monatsnummer zu extrahieren, wodurch derselbe Monat aus verschiedenen Jahren zusammengeführt wird. Die professionelle Lösung ist die Trunkierung: Jeder Zeitstempel wird auf den Beginn seines Zeitraums abgebildet.
- Wochen-, Monats-, Quartals- und Jahres-Buckets
DATE_TRUNCund entsprechende Varianten der jeweiligen SQL-Dialekte- Korrektes Gruppieren, damit Diagramme zeitlich richtig ausgerichtet sind
DATE_TRUNC: Das zentrale Werkzeug
In PostgreSQL setzt DATE_TRUNC(unit, ts) alles, was feiner als die angegebene Einheit ist, auf null. Durch die Trunkierung auf 'month' wird jeder Zeitstempel im März zu 2024-03-01 00:00:00.
Der Rückgabewert ist weiterhin ein Zeitstempel. Dadurch wird er chronologisch sortiert und eignet sich perfekt zum Gruppieren. Dies ist die wichtigste Datumsfunktion für Reporting.
SELECT DATE_TRUNC('month', TIMESTAMP '2024-03-17 14:30:00');
-- 2024-03-01 00:00:00Umsatz nach Monat gruppieren
Das klassische Beispiel. Trunkieren Sie den Zeitstempel auf den Monat und gruppieren und summieren Sie anschließend. Da der Bucket das Jahr enthält, bleiben Januar 2023 und Januar 2024 getrennt.
Eine Sortierung nach dem trunkierten Wert ergibt eine übersichtliche Zeitreihe, die direkt für ein Diagramm verwendet werden kann.
SELECT
DATE_TRUNC('month', order_ts) AS month,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;EXTRACT vs DATE_TRUNC
Interviewer fragen diesen Unterschied häufig direkt ab. Beide Funktionen liefern Informationen über Zeiträume, beantworten aber unterschiedliche Fragen.
EXTRACT(MONTH FROM ts)liefert für jeden März unabhängig vom Jahr die Zahl 3 und eignet sich für saisonale Analysen.DATE_TRUNC('month', ts)liefert den genauen Monatsbeginn, hält die Jahre getrennt und eignet sich für Zeitreihen.
Wenn Sie für ein monatliches Trenddiagramm nach EXTRACT(MONTH ...) gruppieren, werden die Jahre unbemerkt miteinander vermischt.
-- Seasonality: which month is busiest on average?
SELECT EXTRACT(MONTH FROM order_ts) AS month_num, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;
-- Time series: month-by-month trend (years kept separate)
SELECT DATE_TRUNC('month', order_ts) AS month, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;Wochen-Buckets und die Frage nach dem Montag
Beim Gruppieren nach Wochen gibt es eine subtile Frage, die Interviewer gerne stellen: Wann beginnt die Woche? PostgreSQL setzt mit DATE_TRUNC('week', ts) immer den Montag als Wochenbeginn fest (ISO-Wochen).
Wenn das Unternehmen Wochen ab Sonntag verwendet, müssen Sie einen Versatz anwenden. Ein gängiger Trick besteht darin, das Datum um einen Tag zurückzuverschieben, es zu trunkieren und anschließend wieder um einen Tag vorzuverschieben.
-- ISO week (Monday start)
SELECT DATE_TRUNC('week', order_ts) AS iso_week FROM orders;
-- Sunday-start week
SELECT DATE_TRUNC('week', order_ts + INTERVAL '1 day') - INTERVAL '1 day'
AS sunday_week
FROM orders;Quartals-Buckets
Quartalsberichte sind in finanznahen Rollen üblich. DATE_TRUNC('quarter', ts) bildet jeden Zeitstempel auf den ersten Tag seines Quartals ab: den 1. Januar, 1. April, 1. Juli oder 1. Oktober.
Wenn Sie das Quartal stattdessen als Zahl ausgeben möchten, kombinieren Sie EXTRACT(QUARTER ...) mit dem Jahr.
SELECT
DATE_TRUNC('quarter', order_ts) AS quarter_start,
EXTRACT(YEAR FROM order_ts) || '-Q'
|| EXTRACT(QUARTER FROM order_ts) AS quarter_label,
SUM(amount) AS revenue
FROM orders
GROUP BY 1, 2
ORDER BY 1;MySQL hat kein DATE_TRUNC
Eine beliebte Frage zu unterschiedlichen SQL-Dialekten lautet: „MySQL hat kein DATE_TRUNC. Wie gruppieren Sie dann nach Monat?“ Die portable Antwort besteht darin, das Datum auf die gewünschte Granularität zu formatieren.
DATE_FORMAT(ts, '%Y-%m-01')liefert den Monatsbeginn als Text oder Datum.DATE_FORMAT(ts, '%Y-%m')liefert einen sortierbaren Schlüssel wie2024-03.
Für Wochen bietet MySQL YEARWEEK() mit einem Modusargument, das den Wochenbeginn festlegt.
-- MySQL month bucket
SELECT DATE_FORMAT(order_ts, '%Y-%m-01') AS month, SUM(amount)
FROM orders
GROUP BY 1
ORDER BY 1;Gruppieren in SQL Server
SQL Server hatte traditionell keine direkte Trunkierungsfunktion. Daher wurden DATEFROMPARTS oder das Idiom mit DATEADD/DATEDIFF verwendet. Moderne Versionen (ab 2022) bieten DATETRUNC.
Das klassische Idiom „Einheiten seit dem Epochentag zählen und anschließend wieder addieren“ funktioniert in jeder Version und ist daher wissenswert.
-- Portable SQL Server month truncation
SELECT DATEADD(month, DATEDIFF(month, 0, order_ts), 0) AS month_start
FROM orders;
-- SQL Server 2022+
SELECT DATETRUNC(month, order_ts) AS month_start FROM orders;Lücken in einer Zeitreihe auffüllen
Durch die Trunkierung allein werden Zeiträume ohne Zeilen ausgeblendet: Ein Monat ohne Bestellungen erscheint einfach nicht. Interviewer prüfen, ob Sie das bemerken.
Die Lösung besteht darin, ein vollständiges Datumsraster zu erzeugen und die Daten per LEFT JOIN darauf zu verknüpfen. In Postgres erstellt generate_series dieses Datumsraster.
SELECT
cal.month,
COALESCE(SUM(o.amount), 0) AS revenue
FROM generate_series(DATE '2024-01-01', DATE '2024-12-01',
INTERVAL '1 month') AS cal(month)
LEFT JOIN orders o
ON DATE_TRUNC('month', o.order_ts) = cal.month
GROUP BY cal.month
ORDER BY cal.month;Ausführlicheres Beispiel: Aktive Benutzer pro Woche
Kombinieren Sie Bucketing mit dem Zählen eindeutiger Werte. „Wöchentlich aktive Benutzer“ bedeutet: eindeutige Benutzer pro Wochen-Bucket – eine typische Frage aus der Produktanalyse.
Trunkieren Sie den Ereigniszeitstempel auf die Woche und verwenden Sie anschließend COUNT(DISTINCT user_id). Wenn Sie erwähnen, dass Sie ein Wochen-Datumsraster verknüpfen würden, um Wochen ohne Aktivität anzuzeigen, gibt das zusätzliche Pluspunkte.
SELECT
DATE_TRUNC('week', event_ts) AS week,
COUNT(DISTINCT user_id) AS wau
FROM events
GROUP BY 1
ORDER BY 1;Gruppieren nach einer indizierten Spalte
Ein wichtiger Performance-Hinweis: Wenn Sie die Datumsspalte in einer WHERE-Klausel mit DATE_TRUNC umschließen, kann der Abfrageplaner möglicherweise keinen Index für diese Spalte verwenden.
In GROUP BY ist das unproblematisch. Für Filterbedingungen sollten Sie jedoch die unveränderte Spalte mit berechneten Grenzen vergleichen. Dieses Halb-offene-Muster wurde bereits behandelt und gilt auch hier.
-- Avoid in WHERE: DATE_TRUNC('month', order_ts) = '2024-03-01'
-- Prefer:
SELECT * FROM orders
WHERE order_ts >= DATE '2024-03-01'
AND order_ts < DATE '2024-04-01';Kurze Überprüfung
Wählen Sie das passende Werkzeug für ein monatliches Trenddiagramm, in dem die Jahre getrennt bleiben.
Zusammenfassung: Datumsangaben trunkieren und gruppieren
Das sollten Sie sich merken:
DATE_TRUNC(unit, ts)bildet Zeitstempel auf den Beginn eines Zeitraums ab und hält die Jahre getrennt – das richtige Werkzeug für Zeitreihen.EXTRACTliefert eine reine Zahl. Das eignet sich für saisonale Analysen, führt aber zur Zusammenführung der Jahre.- Wochen beginnen in Postgres am Montag; wenden Sie einen Versatz an, wenn Sie Sonntag benötigen.
- MySQL verwendet
DATE_FORMAT; ältere SQL-Server-Versionen verwenden das IdiomDATEADD(DATEDIFF(...)); ab Version 2022 gibt esDATETRUNC. - Verwenden Sie ein erzeugtes Datumsraster + LEFT JOIN, um leere Zeiträume anzuzeigen, und verwenden Sie
DATE_TRUNCnicht inWHERE, damit Indizes genutzt werden können.
Häufig gestellte Fragen
Ist die Lektion „Datumsangaben abschneiden und gruppieren“ kostenlos?
Ja — der vollständige Text von „Datumsangaben abschneiden und gruppieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Datumsangaben abschneiden und gruppieren“?
Mit DATE_TRUNC und entsprechenden Funktionen nach Woche, Monat und Quartal gruppieren. Du übst SQL Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. SQL Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Datumsangaben abschneiden und gruppieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede SQL Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Datumsarithmetik und Intervalle
- Datumsangaben abschneiden und gruppieren
- Zeichenfolgen analysieren und formatieren
- Zeitzonen und Zeitstempel