CodeGym /Corsi /SQL SELF /Arrotondamento e taglio dei dati temporali: DATE_T...

Arrotondamento e taglio dei dati temporali: DATE_TRUNC()

SQL SELF
Livello 32, Lezione 0
Disponibile

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:45 fino 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 TIMESTAMP o il risultato di un'altra funzione, tipo NOW().

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.

2
Compito
SQL SELF, livello 32, lezione 0
Bloccato
Troncare la data all'inizio del mese
Troncare la data all'inizio del mese
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION