Voorbereiding op programmeerinterviews · Les

Datums afkappen en indelen in perioden

Groepeer op week, maand en kwartaal met DATE_TRUNC en equivalenten.

Les 2 van 413 stappen

Datums afkappen en indelen in perioden is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op programmeerinterviews. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.

Waarom het groeperen van datums wordt gevraagd

"Omzet per week weergeven" of "actieve gebruikers per maand" is vaste prik bij sollicitatiegesprekken voor analisten. De getoetste vaardigheid is het terugbrengen van precieze tijdstempels tot een grover tijdvak, zodat rijen samen in groepen vallen.

De fout die beginners maken, is alleen het maandnummer eruit halen, waardoor dezelfde maand uit verschillende jaren wordt samengevoegd. Het professionele antwoord is afkappen: koppel elke tijdstempel aan het begin van de bijbehorende periode.

  • Tijdvakken voor weken, maanden, kwartalen en jaren
  • DATE_TRUNC en equivalenten voor andere dialecten
  • Correct groeperen zodat grafieken goed uitlijnen

DATE_TRUNC: de centrale functie

In PostgreSQL verwijdert DATE_TRUNC(unit, ts) alles wat fijner is dan de opgegeven eenheid. Afkappen op 'month' verandert elke tijdstempel in maart in 2024-03-01 00:00:00.

De retourwaarde is nog steeds een tijdstempel, dus die wordt chronologisch gesorteerd en perfect gegroepeerd. Dit is de nuttigste datumfunctie voor rapportages.

SELECT DATE_TRUNC('month', TIMESTAMP '2024-03-17 14:30:00');
-- 2024-03-01 00:00:00

Omzet per maand groeperen

Het standaard uitgewerkte voorbeeld. Kap de tijdstempel af op de maand en groepeer en tel vervolgens op. Omdat het tijdvak het jaar bevat, blijven januari 2023 en januari 2024 gescheiden.

Sorteren op de afgekapt waarde levert een overzichtelijke tijdreeks op die klaar is voor een grafiek.

SELECT
  DATE_TRUNC('month', order_ts) AS month,
  SUM(amount)                   AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;

EXTRACT versus DATE_TRUNC

Interviewers vragen rechtstreeks naar dit onderscheid. Beide halen informatie over een periode op, maar ze beantwoorden verschillende vragen.

  • EXTRACT(MONTH FROM ts) geeft voor elke maand maart, in alle jaren, het getal 3 terug; dit is nuttig voor seizoenspatronen.
  • DATE_TRUNC('month', ts) geeft het begin van de specifieke maand terug, waarbij de jaren onderscheiden blijven; dit is nuttig voor tijdreeksen.

Als je voor een maandelijkse trendgrafiek groepeert op EXTRACT(MONTH ...), voeg je de jaren ongemerkt samen.

-- 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;

Tijdvakken per week en de maandagvraag

Bij groeperen per week speelt een subtiel punt waar interviewers graag naar vragen: wanneer begint de week? PostgreSQL's DATE_TRUNC('week', ts) zet de datum altijd op maandag (ISO-weken).

Als het bedrijf weken wil die op zondag beginnen, moet je verschuiven. Een gebruikelijke truc is de datum één dag terugschuiven, afkappen en daarna weer één dag vooruit te schuiven.

-- 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;

Tijdvakken per kwartaal

Rapportages per kwartaal komen vaak voor in functies die aan financiën grenzen. DATE_TRUNC('quarter', ts) zet elke tijdstempel om naar de eerste dag van het kwartaal: 1 januari, 1 april, 1 juli of 1 oktober.

Als je het kwartaal liever als nummer labelt, combineer je EXTRACT(QUARTER ...) met het jaar.

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 heeft geen DATE_TRUNC

Een geliefde vraag over verschillende dialecten: "MySQL heeft geen DATE_TRUNC, hoe deel je dan in op maand?" Het overdraagbare antwoord is de datum formatteren op de gewenste granulariteit.

  • DATE_FORMAT(ts, '%Y-%m-01') geeft het begin van de maand als tekst of datum.
  • DATE_FORMAT(ts, '%Y-%m') geeft een sorteerbare tekenreekssleutel zoals 2024-03.

Voor weken biedt MySQL YEARWEEK() met een modusargument dat bepaalt wanneer de week begint.

-- MySQL month bucket
SELECT DATE_FORMAT(order_ts, '%Y-%m-01') AS month, SUM(amount)
FROM orders
GROUP BY 1
ORDER BY 1;

Tijdvakken in SQL Server

SQL Server had historisch gezien geen directe afkapfunctie, dus gebruikten kandidaten DATEFROMPARTS of de idiomatische combinatie DATEADD/DATEDIFF. Moderne versies (2022 en nieuwer) voegen DATETRUNC toe.

De klassieke werkwijze — eenheden tellen vanaf het epoch en ze daarna weer optellen — werkt in elke versie en is de moeite waard om te kennen.

-- 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;

Hiaten in een tijdreeks opvullen

Alleen afkappen laat perioden met nul rijen weg: een maand zonder bestellingen verschijnt dan eenvoudigweg niet. Interviewers toetsen of je dit opmerkt.

De oplossing is een volledige reeks perioden genereren en de gegevens daar met LEFT JOIN aan koppelen. In Postgres bouwt generate_series deze reeks.

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;

Dieper voorbeeld: actieve gebruikers per week

Combineer het indelen in tijdvakken met het tellen van unieke waarden. "Wekelijks actieve gebruikers" betekent unieke gebruikers per weektijdvak; dat is een echte vraag uit productanalyse.

Kap de tijdstempel van de gebeurtenis af op de week en gebruik vervolgens COUNT(DISTINCT user_id). Als je vermeldt dat je een reeks weken zou koppelen om weken zonder activiteit te tonen, levert dat extra punten op.

SELECT
  DATE_TRUNC('week', event_ts) AS week,
  COUNT(DISTINCT user_id)      AS wau
FROM events
GROUP BY 1
ORDER BY 1;

Indelen in tijdvakken op een geïndexeerde kolom

Een prestatiekanttekening die je kunt noemen: als je de datumkolom in DATE_TRUNC verpakt binnen een WHERE-clausule, kan de planner mogelijk geen index op die kolom gebruiken.

In GROUP BY is dat prima, maar bij filteren kun je beter de onbewerkte kolom vergelijken met berekende grenzen. We hebben dit halfopen patroon eerder behandeld; het geldt hier ook.

-- 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';

Korte controle

Kies het juiste hulpmiddel voor een maandelijkse trendgrafiek waarin de jaren gescheiden blijven.

Samenvatting: datums afkappen en indelen in tijdvakken

Dit moet je onthouden:

  • DATE_TRUNC(unit, ts) koppelt tijdstempels aan het begin van een periode en houdt de jaren gescheiden; het is het juiste hulpmiddel voor tijdreeksen.
  • EXTRACT geeft een kaal getal terug, wat goed werkt voor seizoenspatronen, maar voegt de jaren samen.
  • In Postgres beginnen weken op maandag; verschuif de datum als je zondag nodig hebt.
  • MySQL gebruikt DATE_FORMAT; oudere SQL Server-versies gebruiken de combinatie DATEADD(DATEDIFF(...)); vanaf versie 2022 is er DATETRUNC.
  • Gebruik een gegenereerde datumreeks + LEFT JOIN om lege perioden te tonen, en gebruik DATE_TRUNC niet in WHERE om indexgebruik te behouden.
Gratis beginnen

Leer Voorbereiding op programmeerinterviews met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
90
Lessen
360

Veelgestelde vragen

Is de les “Datums afkappen en indelen in perioden” gratis?

Ja — de volledige tekst van “Datums afkappen en indelen in perioden” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op programmeerinterviews wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.

Wat leer ik in “Datums afkappen en indelen in perioden”?

Groepeer op week, maand en kwartaal met DATE_TRUNC en equivalenten. Je oefent met Voorbereiding op programmeerinterviews door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Voorbereiding op programmeerinterviews te beginnen?

Ervaring vooraf is niet nodig. Voorbereiding op programmeerinterviews op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Datums afkappen en indelen in perioden”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op programmeerinterviews?

Ja. Elke les over Voorbereiding op programmeerinterviews bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Datumberekeningen en intervallen
  2. Datums afkappen en indelen in perioden
  3. Tekenreeksen parseren en opmaken
  4. Tijdzones en tijdstempels
← Terug naar Voorbereiding op programmeerinterviews