DATE_TRUNC() è uno strumento potente che ti permette di tagliare i valori temporali fino a una certa unità di tempo. Per esempio, puoi arrotondare un timestamp all'inizio del giorno, del mese, dell'anno, dell'ora e così via. È super utile quando analizzi i dati per periodi (tipo se vuoi raggruppare gli ordini per giorno, mese o anno).
Pensa a una data e ora come una stringa lunga di testo, dove hai ore, minuti, secondi. La funzione DATE_TRUNC() prende questa stringa e "taglia" quello che non ti serve, lasciando solo la parte che ti interessa. Per esempio:
- Vuoi tagliare la data
2023-10-01 15:30:45fino all'inizio del giorno. Il risultato sarà2023-10-01 00:00:00. - Oppure vuoi lasciare solo il primo secondo dell'ora, cioè
2023-10-01 15:00:00.
Sintassi
La sintassi della funzione DATE_TRUNC() è questa:
DATE_TRUNC(field, source)
- field — è l'unità di tempo fino a cui vuoi "tagliare" la data. Per esempio,
year,month,day,hour,minute. - source — è il valore temporale che vuoi tagliare. Può essere una colonna di tipo
TIMESTAMPo il risultato di un'altra funzione, tipoNOW().
Esempio di chiamata semplice:
SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45');
-- Risultato: 2023-10-01 00:00:00
Campi supportati
Ecco una lista di alcune unità di tempo supportate che puoi usare in DATE_TRUNC():
| Unità di tempo | Descrizione |
|---|---|
year |
Inizio dell'anno (per esempio, 2023-01-01 00:00:00) |
quarter |
Inizio del trimestre (per esempio, 2023-07-01 00:00:00) |
month |
Inizio del mese (per esempio, 2023-10-01 00:00:00) |
week |
Inizio della settimana* (per esempio, 2023-09-25 00:00:00) |
day |
Inizio del giorno (per esempio, 2023-10-01 00:00:00) |
hour |
Inizio dell'ora (per esempio, 2023-10-01 15:00:00) |
minute |
Inizio del minuto (per esempio, 2023-10-01 15:30:00) |
second |
Inizio del secondo (per esempio, 2023-10-01 15:30:45) |
Più piccola è l'unità di tempo, più preciso sarà il risultato del taglio. Ah, e la settimana inizia dalla domenica :)
Esempi di utilizzo di DATE_TRUNC()
Taglio fino all'inizio del giorno. In questo esempio prendiamo un timestamp e lo arrotondiamo all'inizio del giorno:
SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45') AS truncated_day;
-- Risultato: 2023-10-01 00:00:00
Taglio fino all'inizio del mese. Ora tagliamo la data fino all'inizio del mese:
SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-01 15:30:45') AS truncated_month;
-- Risultato: 2023-10-01 00:00:00
Taglio fino all'inizio dell'anno. Proviamo ad arrotondare la data fino all'inizio dell'anno:
SELECT DATE_TRUNC('year', TIMESTAMP '2023-10-01 15:30:45') AS truncated_year;
-- Risultato: 2023-01-01 00:00:00
Uso con l'ora attuale (NOW()). Se vuoi lavorare sempre con la data e ora attuali, puoi combinare DATE_TRUNC() e NOW():
SELECT DATE_TRUNC('hour', NOW()) AS truncated_hour;
-- Il risultato dipende dall'ora attuale, per esempio: 2023-10-01 15:00:00
Raggruppamento degli ordini per mese. Passiamo ora a un esempio più pratico. Supponiamo di avere una tabella con gli ordini, dove per ogni record c'è la data dell'ordine. Vogliamo contare quanti ordini ci sono stati ogni mese:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date TIMESTAMP NOT NULL
);
INSERT INTO orders (order_date) VALUES
('2023-10-01 10:15:00'),
('2023-10-01 15:30:00'),
('2023-09-15 12:45:00'),
('2023-08-20 09:00:00'),
('2023-08-25 10:30:00');
SELECT DATE_TRUNC('month', order_date) AS order_month,
COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;
Risultato:
| order_month | total_orders |
|---|---|
| 2023-08-01 00:00 | 2 |
| 2023-09-01 00:00 | 1 |
| 2023-10-01 00:00 | 2 |
Casi pratici di utilizzo
Analisi dei dati temporali per periodi: vuoi sapere quanti utenti si sono registrati ogni anno, mese o giorno? Usa DATE_TRUNC() per raggruppare i dati.
Creazione di report: arrotondare correttamente il timestamp rende i report molto più leggibili.
Confronto di data e ora: se hai dati temporali con una precisione molto alta (tipo con i millisecondi), tagliali al livello che ti serve per confrontarli correttamente.
Errori tipici nell'uso di DATE_TRUNC()
Uso di campi non supportati. Per esempio, il campo millisecond non è supportato, e se provi a usarlo ti darà errore.
Tipo di dato sbagliato. La funzione DATE_TRUNC() funziona solo con tipi di dato temporali, come TIMESTAMP. Se le passi una stringa, otterrai un errore.
Errore di arrotondamento. Ricorda che DATE_TRUNC() taglia sempre il tempo fino all'inizio dell'unità di tempo specificata. Se vuoi arrotondare il tempo, dovresti usare altri metodi.
GO TO FULL VERSION