Sintassi di datepart
Il parametro datepart definisce l’unità di tempo in cui calcolare la differenza. SQL Server supporta i seguenti valori di datepart:
| Datepart | Alias |
|---|---|
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
day | dd, d |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
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 > startdatee 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_differencerestituisce23perché i due timestamp distano 23 ore.minutes_differencerestituisce1439, cioè23 hours * 60 minutes.seconds_differencerestituisce86,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_datee 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

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à.


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:Parametro
Che cos’è?
datepartParametro obbligatorio. È l’unità in cui
DATEDIFF()riporta la differenza trastartdateedenddate. Vedi la sezione seguente per i diversi tipi di valori ammessi.startdateParametro obbligatorio che indica un valore datetime che rappresenta la data di inizio.
enddateParametro obbligatorio che indica un valore datetime che rappresenta la data di fine.