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, formatYYYY-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:
| Coloana | Tip |
|---|---|
customers.signed_up_on | DATE |
orders.ordered_at | TIMESTAMP |
orders.shipped_at | TIMESTAMP (poate fi NULL) |
EXTRACT — citirea unei părți
EXTRACT(part FROM date) extrage un număr:
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ă:
-- 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:
SELECT id,
shipped_at - ordered_at AS wait_time
FROM orders
WHERE shipped_at IS NOT NULL;Comparații cu un literal INTERVAL:
WHERE shipped_at - ordered_at > INTERVAL '1 day'Adăugarea de zile la o dată:
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM customers;Încearcă
Numărați câte comenzi au fost plasate pe an. Două coloane: year (intger) și order_count. Ordinea dupa an crescator.
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
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.
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