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