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).