Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL DATEDIFF() vs TIMESTAMPDIFF():qual è la differenza?

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 |
+----------+---------------+