Vai al contenuto principale

FUNZIONE SQL DATEDIFF()

DATEDIFF() è una delle funzioni più utilizzate per la manipolazione di date in SQL. Imparala con questo tutorial.
· 3 min leggi

Scopri con l'IA

DATEDIFF() è una delle funzioni più utilizzate per la manipolazione di data e ora in SQL. Questo tutorial ti guiderà nell’uso, nella sintassi e nelle principali differenze tra i dialetti SQL più diffusi, così da padroneggiare questa potente funzione.

Che cos’è la funzione DATEDIFF()?

La funzione DATEDIFF() calcola la differenza tra due valori di data o timestamp e restituisce il risultato in un’unità specificata, come giorni, mesi o anni.

Sintassi di DATEDIFF nei vari dialetti SQL

La sintassi di DATEDIFF() varia a seconda del dialetto SQL. Di seguito trovi esempi per i database più comuni:

 

Ecco l’articolo completamente aggiornato e rifinito con tutti i miglioramenti richiesti:


FUNZIONE SQL DATEDIFF()

DATEDIFF() è una delle funzioni più utilizzate per la manipolazione di data e ora in SQL. Questo tutorial ti guiderà nell’uso, nella sintassi e nelle principali differenze tra i dialetti SQL più diffusi, così da padroneggiare questa potente funzione.


Che cos’è la funzione DATEDIFF()?

La funzione DATEDIFF() calcola la differenza tra due valori di data o timestamp e restituisce il risultato in un’unità specificata, come giorni, mesi o anni.


Sintassi di DATEDIFF nei vari dialetti SQL

La sintassi di DATEDIFF() varia a seconda del dialetto SQL. Di seguito trovi esempi per i database più comuni:

SQL Server

DATEDIFF(datepart, startdate, enddate)
  • datepart: l’unità di tempo (ad esempio year, month, day).
  • startdate e enddate: le date o i timestamp da confrontare. Il risultato è calcolato come enddate - startdate.

MySQL

DATEDIFF(enddate, startdate)
  • Restituisce solo la differenza in giorni.

PostgreSQL

PostgreSQL non ha una funzione DATEDIFF(), ma offre funzionalità simili tramite:

  • La funzione AGE():
SELECT AGE(enddate, startdate);
  • Sottrazione diretta di valori di data:
SELECT enddate - startdate;

Parametro

Che cos’è?

datepart

Parametro obbligatorio. È l’unità in cui DATEDIFF() riporta la differenza tra startdate ed enddate. Vedi la sezione seguente per i diversi tipi di valori ammessi. 

startdate

Parametro obbligatorio che indica un valore datetime che rappresenta la data di inizio. 

enddate

Parametro obbligatorio che indica un valore datetime che rappresenta la data di fine. 

Sintassi di datepart 

Il parametro datepart definisce l’unità di tempo in cui calcolare la differenza. SQL Server supporta i seguenti valori di datepart:

DatepartAlias
yearyy, yyyy
quarterqq, q
monthmm, m
daydd, d
hourhh
minutemi, n
secondss, s
millisecondms

Nota: MySQL supporta solo day come unità di tempo per DATEDIFF().

  • Apici: usa sempre gli apici singoli (') per i valori di data e ora.
  • Risultati positivi e negativi: in SQL Server, il risultato è positivo quando enddate > startdate e negativo altrimenti.
  • Gestione degli errori: se il risultato supera ±2.147.483.647, usa DATEDIFF_BIG() in SQL Server.

Esempi di DATEDIFF()

Con DATEDIFF(), i risultati possono essere valori positivi o negativi. Se enddate è successiva a startdate, DATEDIFF() restituisce un valore positivo. Se enddate è precedente a startdate, DATEDIFF() restituisce un valore negativo. 

Esempio 1: calcolare la differenza tra due date

In SQL Server:

SELECT DATEDIFF(year, '2022-12-31', '2024-06-01') AS years_difference;

Spiegazione: calcola la differenza in anni tra le due date. Poiché vengono conteggiati il 2023 e parte del 2024, il risultato è 1.

In MySQL: 

SELECT DATEDIFF('2024-06-01', '2022-12-31') AS days_difference;

Spiegazione: MySQL supporta solo differenze in giorni. Il risultato è 518.

Esempio 2: calcolare la differenza tra due timestamp

SELECT 
    DATEDIFF(hour, '2023-12-31 00:00:00', '2023-12-31 23:59:59') AS hours_difference,
    DATEDIFF(minute, '2023-12-31 00:00:00', '2023-12-31 23:59:59') AS minutes_difference,
    DATEDIFF(second, '2023-12-31 00:00:00', '2023-12-31 23:59:59') AS seconds_difference;

Spiegazione:

  • hours_difference restituisce 23 perché i due timestamp distano 23 ore.
  • minutes_difference restituisce 1439, cioè 23 hours * 60 minutes.
  • seconds_difference restituisce 86,399, cioè 1439 minutes * 60 seconds.

Esempio 3: calcolare la differenza tra due colonne di tipo data

Supponiamo di avere una tabella orders con order_date e shipped_date. Usa DATEDIFF() per calcolare il tempo di spedizione di ciascun ordine.

SELECT 
    order_id,
    DATEDIFF(day, order_date, shipped_date) AS shipping_days 
FROM sales.orders;

Spiegazione: la query calcola il numero di giorni impiegati per spedire ciascun ordine.

Esempio 4. Trovare l’intervallo tra la data di oggi e una colonna

Usando la tabella sales.orders come nell’Esempio 3, possiamo usare DATEDIFF() per trovare l’intervallo tra la data di oggi e la data in cui è stato effettuato un ordine.

SELECT 
    order_id,
    order_date,
    GETDATE() AS today_date,
    DATEDIFF(day, order_date, GETDATE()) AS days_from_order;

Spiegazione:

  • GETDATE() recupera data e ora correnti in SQL Server.
  • Viene calcolata la differenza in giorni tra order_date e oggi.

Note aggiuntive

La funzione DATEDIFF() restituisce un errore se il risultato è fuori intervallo (cioè maggiore di +2.147.483.647 o minore di -2.147.483.647). In tal caso è opportuno usare DATEDIFF_BIG(). 

Errori comuni e risoluzione dei problemi

Lavorando con DATEDIFF() è facile incorrere in problemi legati a sintassi, ordine degli argomenti o comportamento specifico del database. Ecco gli errori più comuni e come risolverli:

1. Apici non corretti

Problema: uso di apici attorno a datepart o stili di apici incoerenti per i letterali di data.

Soluzione: lascia sempre datepart senza apici e usa apici singoli per le date.

-- Errato
SELECT DATEDIFF('year', '2023-01-01', '2024-01-01');

-- Corretto
SELECT DATEDIFF(year, '2023-01-01', '2024-01-01');
 

2. datepart non supportato in MySQL

Problema: DATEDIFF() di MySQL supporta solo differenze in giorni.

Soluzione: usa TIMESTAMPDIFF() per unità più granulari come anni o mesi.

-- Corretto (MySQL)
SELECT TIMESTAMPDIFF(YEAR, '2023-01-01', '2024-01-01') AS years_difference; -- Returns 1

3. Ordine degli argomenti

Problema: invertire startdate ed enddate può portare a risultati negativi inattesi.

Soluzione: assicurati che startdate venga prima. Usa ABS() se ti interessa solo il valore assoluto.

-- Errato
SELECT DATEDIFF(day, '2023-01-05', '2023-01-01'); -- Returns -4

-- Corretto
SELECT DATEDIFF(day, '2023-01-01', '2023-01-05'); -- Returns 4

4. Formati data dipendenti dalla locale

Problema: formati di data ambigui (ad es. MM/DD/YYYY vs. DD/MM/YYYY) possono causare errori.

Soluzione: usa lo standard ISO 8601 (YYYY-MM-DD) per evitare ambiguità.

-- Corretto
SELECT DATEDIFF(day, '2023-01-01', '2023-12-31'); -- Returns 364

5. Valori fuori intervallo (SQL Server)

Problema: differenze molto ampie oltre ±2.147.483.647 causano un errore di overflow.Soluzione: usa DATEDIFF_BIG() per intervalli estesi.

-- Corretto
SELECT DATEDIFF_BIG(day, '0001-01-01', '9999-12-31'); -- Returns 2,920,862,800

Requisiti tecnici

Funziona in SQL Server (a partire dal 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

Vedi anche

Per saperne di più su SQL

Travis Tang

Autore

Travis Tang

Data scientist presso Tiktok e studente magistrale al GeorgiaTech, ho una passione innata per la data science e ho costruito un percorso professionale unico che intreccia tecnologia, rischio e miglioramento continuo. Durante il mio periodo come Data Scientist presso Merchant Platform, ho mitigato rischi e contrastato le frodi usando modelli di dati complessi, facendo risparmiare migliaia di dollari ogni settimana. Ho affinato le mie competenze dedicando innumerevoli ore all’autoapprendimento, ottenendo certificazioni da istituzioni rinomate e diventando esperto in temi come Deep Learning, TensorFlow e Social Network Analysis. Su DataCamp e altre piattaforme educative metto a frutto questo bagaglio per ispirare e formare altre persone, aprendo nuove strade nel campo della data science e dimostrando che, con determinazione e i dati giusti, ogni rischio può trasformarsi in un’opportunità.

Argomenti

Correlato