Salt la conținutul principal
Modulul 6 · Lecția 2 din 422/57 în curs~12 min
Lecții din modul (2/4)

Funcții de dată și de timp

Datele și marcajele de timp sunt peste tot: comenzi, autentificări, evenimente, facturare. În în această lecție vedem cum să extragem părți dintr-o dată (an, lună...), trunchiați la o granularitate (lună, săptămână...), calculați intervale și diferențe și face comparații între perioade.

Tipurile de bază

PostgreSQL distinge:

  • DATE — numai data, format YYYY-MM-DD;
  • TIMESTAMP — dată + oră, fără fus orar;
  • TIMESTAMPTZ — data + ora + fus orar;
  • INTERVAL — o perioadă (de exemplu, '3 days', '2 hours 30 minutes').

În setul nostru de date ecommerce:

ColoanaTip
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (poate fi NULL)

EXTRACT — citirea unei părți

EXTRACT(part FROM date) extrage un număr:

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;

Cele mai utilizate piese: YEAR, MONTH, DAY, HOUR, MINUTE, DOW(zi a săptămânii 0-6), DOY (ziua anului).

DATE_TRUNC — rotunjire în jos

DATE_TRUNC('part', date) „trunchează” data la o granularitate. Este esențial pentru agregarea pe lună, săptămână, oră:

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;

Piese valide: 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'.

Pentru a fi lizibil, utilizatorii trimit adesea la DATE atunci când nu este nevoie de timp: DATE_TRUNC('month', ordered_at)::date.

Diferențele și intervalele

Scăderea a două TIMESTAMP produce un INTERVAL:

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

Comparații cu un literal INTERVAL:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

Adăugarea de zile la o dată:

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

Încearcă

Exercițiu#sql.m6.l2.e1
Încercări: 0Se încarcă…

Numărați câte comenzi au fost plasate pe an. Două coloane: year (intger) și order_count. Ordinea dupa an crescator.

Se încarcă editorul...
Afișează indiciu

EXTRACT(YEAR FROM ordered_at) returnează un NUMERIC: aruncați-l în int cu ::int pentru lizibilitate.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m6.l2.e2
Încercări: 0Se încarcă…

Pentru fiecare lună a anului 2024, arătați prima zi a lunii (coloana lună, de tip data) și numărul de comenzi. Comanda pe luna.

Se încarcă editorul...
Afișează indiciu

DATE_TRUNC('lună', ordonat_la) returnează prima zi a lunii ca marcaj temporal; ::date îl convertește în dată.

Soluție disponibilă după 3 încercări