Database.Guide
Il Gennaio 27, 2022 da adminQuesto articolo esamina la differenza tra due funzioni MySQL; DATEDIFF()
e TIMESTAMPDIFF()
.
Entrambe le funzioni restituiscono la differenza tra due date e/o tempi, ma il risultato è diverso tra le due funzioni.
La seguente tabella riassume la differenza tra queste due funzioni:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
Richiede 2 argomenti. | Richiede 3 argomenti. |
Sottrae il 2° argomento dal 1° (expr1 – expr2). | Sottrae il 2° argomento dal 3° (expr2 – expr1). |
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 – Operazione di base
Ecco un esempio che dimostra come queste funzioni lavorano, e come i risultati sono diversi, anche quando si usa 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 – Cambiare l’unità
Come dimostra l’esempio precedente, la TIMESTAMPDIFF()
vi permette di specificare un’unità per i risultati da restituire (in effetti, vi richiede di specificare l’unità). D’altra parte, DATEDIFF()
non vi permette di specificare un’unità. Restituisce solo il risultato in giorni.
Potremmo quindi modificare l’esempio precedente in modo che TIMESTAMPDIFF()
restituisca il numero di ore invece 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 |+----------+---------------+
Si può andare 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 seconda 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 vediamo 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 sbagliati
Entrambe le funzioni restituiscono null se viene loro passato il tipo di argomento sbagliato.
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 argomento misti
Entrambe le funzioni permettono di fornire una data come argomento e un datetime come 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 |+----------+---------------+
Lascia un commento