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

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

Questo articolo esamina la differenza tra MySQL TIMEDIFF() e TIMESTAMPDIFF() funzioni.

Entrambe le funzioni fanno una cosa simile, ma ci sono alcune differenze significative tra le due.

La tabella seguente riassume la differenza tra queste due funzioni:

TIMEDIFF() TIMESTAMPDIFF()
Richiede 2 argomenti. Richiede 3 argomenti.
Sottrae il 2° argomento dal 1° (data1 − data2). Sottrae il 2° argomento dal 3° (data2 − data1).
Il risultato è espresso come valore temporale (e presenta le limitazioni del tipo di dati temporali). Il risultato è un numero intero, espresso da un numero di unità fornito dal primo argomento.
Accetta le espressioni di ora o data e ora. Accetta le espressioni di data o data e ora.
Entrambi gli argomenti devono essere dello stesso tipo (ora o data e ora). Entrambi gli argomenti possono essere di tipo diverso (data o data/ora).

Esempio 1 – Differenza di base

Ecco un esempio che dimostra la differenza fondamentale tra queste funzioni.

SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';

Risultato:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| 24:00:00 |           -24 |
+----------+---------------+

Quindi possiamo vedere che TIMEEDIFF() ha restituito un valore temporale e TIMESTAMPDIFF() restituito un numero intero.

Inoltre, TIMEEDIFF() sottratto la 2a data dalla 1a, mentre TIMESTAMPDIFF() sottratto la 1a data dalla 2a.

Esempio 2 – Modifica dell'unità

Come accennato, TIMESTAMPDIFF() ci permette di specificare in quale unità rappresentare il risultato. Ecco alcuni esempi:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';

Risultato:

+----------+-------+---------+---------+
| TIMEDIFF | Hours | Minutes | Seconds |
+----------+-------+---------+---------+
| 36:15:35 |   -36 |   -2175 | -130535 |
+----------+-------+---------+---------+

Tuttavia, ecco cosa succede se utilizziamo un'unità più grande della differenza di orario effettiva:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks',
  TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';

Risultato:

+----------+------+-------+--------+
| TIMEDIFF | Days | Weeks | Months |
+----------+------+-------+--------+
| 36:15:35 |   -1 |     0 |      0 |
+----------+------+-------+--------+

In questo caso, la differenza di orario non era abbastanza grande da influenzare i valori della settimana o del mese.

Esempio 3 – Tipi di argomenti errati

Ecco un esempio di cosa succede quando passi i tipi di argomenti sbagliati a ciascuna funzione.

SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';

Risultato:

+---------------+--------------------+
| TIMEDIFF Date | TIMESTAMPDIFF Time |
+---------------+--------------------+
| 00:00:00      |               NULL |
+---------------+--------------------+

Il TIMEDIFF() non supporta il tipo di dati "data", quindi restituisce 00:00:00 .

E il TIMESTAMPDIFF() La funzione non supporta il tipo di dati "ora", quindi restituisce NULL .

Esempio 4 – Tipi di argomenti misti

Ecco cosa succede se fornisci due tipi di dati diversi a ciascuna funzione.

SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';

Risultato:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| NULL     |           -24 |
+----------+---------------+

Quindi possiamo vedere che TIMESTAMPDIFF() gestisce correttamente i tipi di dati misti (purché siano data o data e ora).

Tuttavia, TIMEDIFF() richiede che entrambi gli argomenti siano dello stesso tipo, quindi otteniamo NULL , anche se entrambi gli argomenti sono di un tipo supportato dalla funzione (ora e data e ora).

Possiamo confermare che entrambi i tipi sono effettivamente supportati da questa funzione con il seguente esempio:

SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime1, @thetime2) AS 'time',
  TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';

Risultato:

+----------+----------+
| time     | datetime |
+----------+----------+
| 02:00:00 | 48:00:00 |
+----------+----------+

Quindi va bene, purché entrambi gli argomenti siano dello stesso tipo (valori di ora o data e ora).