Questo articolo esamina la differenza tra due funzioni MySQL; DATEDIFF()
e TIMESTAMPDIFF()
.
Entrambe le funzioni restituiscono la differenza tra due date e/o orari, ma il risultato è diverso tra le due funzioni.
La tabella seguente riassume la differenza tra queste due funzioni:
DATEDIFF() | TIMESTAMPDIFF() |
---|---|
Richiede 2 argomenti. | Richiede 3 argomenti. |
Sottrae il 2° argomento dal 1° (espr1 − espr2). | Sottrae il 2° argomento dal 3° (espr2 − espr1). |
Il risultato è espresso come valore in giorni. | Il risultato è espresso come l'unità fornita dal primo argomento. |
Può confrontare solo il valore della data dei suoi argomenti. | Può confrontare il valore di data e ora dei suoi argomenti. |
Esempio 1 – Operazioni di base
Ecco un esempio che dimostra come funzionano queste funzioni e come i risultati sono diversi, anche quando si utilizza la stessa unità.
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'TIMESTAMPDIFF';
Risultato:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+
Quindi entrambe le funzioni restituiscono la differenza in giorni, tuttavia un risultato è positivo e l'altro negativo. Questo perché DATEDIFF()
sottrae la seconda data dalla prima, mentre TIMESTAMPDIFF()
sottrae la prima data dalla seconda.
Esempio 2 – Modifica dell'unità
Come dimostra l'esempio precedente, TIMESTAMPDIFF()
consente di specificare un'unità per i risultati da restituire (infatti, richiede specificare l'unità). D'altra parte, DATEDIFF()
non consente di specificare un'unità. Restituisce solo il risultato in giorni.
Quindi potremmo modificare l'esempio precedente in modo che TIMESTAMPDIFF()
restituisce il numero di ore anziché di giorni:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';
Risultato:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -24 | +----------+---------------+
Puoi arrivare fino ai microsecondi:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'TIMESTAMPDIFF';
Risultato:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -86400000000 | +----------+---------------+
Esempio 3 – Precisione
La precisione di DATEDIFF()
è un giorno e TIMESTAMPDIFF()
può scendere al microsecondo. Tuttavia la precisione di TIMESTAMPDIFF()
(e l'unità che confronta) dipende ancora dall'unità specificata.
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-10 23:59:59'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Risultato:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | 0 | 0 | 23 | 1439 | 86399 | 86399000000 | +----------+------+-------+---------+---------+--------------+
Ed ecco il risultato se incrementiamo la 2a data di un secondo (che la porta al giorno successivo):
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-11 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Risultato:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | -1 | 1 | 24 | 1440 | 86400 | 86400000000 | +----------+------+-------+---------+---------+--------------+
Ecco un altro esempio, questa volta per vedere come appare quando restituiamo mesi, trimestri e anni quando la differenza è di un mese (o 31 giorni):
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-11-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(month, @date1, @date2) AS 'Month', TIMESTAMPDIFF(quarter, @date1, @date2) AS 'Quarter', TIMESTAMPDIFF(year, @date1, @date2) AS 'Year';
Risultato:
+----------+------+-------+---------+------+ | DATEDIFF | Days | Month | Quarter | Year | +----------+------+-------+---------+------+ | -31 | 31 | 1 | 0 | 0 | +----------+------+-------+---------+------+
Esempio 4 – Tipi di argomenti errati
Entrambe le funzioni restituiscono null se viene passato il tipo di argomento errato.
SET @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Risultato:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | NULL | +----------+---------------+
Esempio 5 – Tipi di argomenti misti
Entrambe le funzioni consentono di fornire una data come argomento e una data e ora come un altro argomento.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Risultato:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+