Direct naar de hoofdinhoud
Module 6 · Les 2 van 422/57 in de cursus~12 min
Modulelessen (2/4)

Datum- en tijdstempelfuncties

Datums en tijdstempels zijn overal: bestellingen, logins, evenementen, facturering. In deze les zien we hoe je delen uit een datum (jaar, maand…) kunt extraheren, kort het af tot een granulariteit (maand, week...), bereken intervallen en verschillen, en vergelijkingen tussen perioden maken.

De basistypen

PostgreSQL onderscheidt:

  • DATE — alleen datum, formaat YYYY-MM-DD;
  • TIMESTAMP — datum + tijd, geen tijdzone;
  • TIMESTAMPTZ — datum + tijd + tijdzone;
  • INTERVAL — een punt (bijvoorbeeld '3 days', '2 hours 30 minutes').

In onze ecommerce dataset:

KolomTyp
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (kan NULL zijn)

EXTRACT — een gedeelte lezen

EXTRACT(part FROM date) extraheert een getal:

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;

De meest gebruikte onderdelen: YEAR, MONTH, DAY, HOUR, MINUTE, DOW (dag van week 0-6), DOY (dag van het jaar).

DATE_TRUNC — naar beneden afgerond

DATE_TRUNC('part', date) "kapt" de datum af tot een granulariteit. Het is essentieel voor aggregatie per maand, week, uur:

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;

Geldige onderdelen: 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'.

Voor de leesbaarheid casten mensen vaak naar DATE als er geen tijd nodig is: DATE_TRUNC('month', ordered_at)::date.

Verschillen en intervallen

Het aftrekken van twee TIMESTAMPs levert een INTERVAL op:

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

Vergelijkingen met een letterlijke INTERVAL:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

Dagen aan een datum toevoegen:

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

Probeer het

Oefening#sql.m6.l2.e1
Pogingen: 0Laden…

Tel hoeveel bestellingen er per jaar zijn geplaatst. Twee kolommen: jaar (geheel getal) en order_count. Sorteer per jaar oplopend.

Editor laden…
Toon hint

EXTRACT(JAAR VAN bestelde_at) retourneert een NUMERIC: cast het naar int met ::int voor leesbaarheid.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#sql.m6.l2.e2
Pogingen: 0Laden…

Toon voor elke maand van 2024 de eerste dag van de maand (kolom maand, van type datum) en het aantal bestellingen. Bestel per maand.

Editor laden…
Toon hint

DATE_TRUNC('maand', besteld_at) retourneert de eerste dag van de maand als tijdstempel; ::date converteert het naar datum.

Oplossing beschikbaar na 3 pogingen