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

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

Due funzioni di data incluse in MySQL sono DATEDIFF() e TIMEDIFF() .

Entrambe le funzioni fanno una cosa simile, ma con alcune differenze significative.

La tabella seguente riassume la differenza tra queste due funzioni:

DATEDIFF() TIMEDIFF()
Il risultato è espresso come valore in giorni. Il risultato è espresso come valore temporale.
Confronta solo il valore della data dei suoi argomenti. Confronta il valore temporale dei suoi argomenti.
Accetta le espressioni di data o data e ora. Accetta le espressioni di ora o data e ora.
Entrambi gli argomenti possono essere di tipo diverso (data o data e ora). Entrambi gli argomenti devono essere dello stesso tipo (ora o data e 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 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';

Risultato:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | 24:00:00 |
+----------+----------+

Quindi possiamo vedere che DATEDIFF() restituito 1 , che significa "1 giorno", e TIMEDIFF() restituito 24:00:00 che è la rappresentazione dell'ora di 1 giorno esatto.

Esempio 2 – Specifica di un valore temporale

Vediamo cosa succede se aumentiamo il valore del tempo di una delle variabili.

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';

Risultato:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | 36:15:35 |
+----------+----------+

Quindi DATEDIFF() restituisce lo stesso risultato dell'esempio precedente. Questo perché confronta solo i valori della data (ignora qualsiasi valore dell'ora).

Il TIMEDIFF() la funzione, invece, confronta il tempo e quindi restituisce un risultato più preciso. Ci mostra che ci sono 36 ore, 15 minuti e 35 secondi tra i due valori di data e ora.

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 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF Date',
  DATEDIFF(@time1, @time2) AS 'DATEDIFF Time',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMEDIFF(@time1, @time2) AS 'TIMEDIFF Time';

Risultato:

+---------------+---------------+---------------+---------------+
| DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time |
+---------------+---------------+---------------+---------------+
|             1 |          NULL | 00:00:00      | 12:15:35      |
+---------------+---------------+---------------+---------------+

Il primo e l'ultimo risultato vanno bene, perché sono stati passati i tipi di argomento corretti. Tuttavia, i due risultati centrali avevano il tipo di dati sbagliato passato e quindi non è stato possibile calcolare il risultato corretto.

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 
  DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF',
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF';

Risultato:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | NULL     |
+----------+----------+

Quindi possiamo vedere che DATEDIFF() 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 |
+----------+----------+