Este artigo analisa a diferença entre o MySQL
TIMEDIFF()
e TIMESTAMPDIFF()
funções. Ambas as funções fazem uma coisa semelhante, mas existem algumas diferenças significativas entre as duas.
A tabela a seguir resume a diferença entre essas duas funções:
TIMEDIFF() | TIMESTAMPDIFF() |
---|---|
Requer 2 argumentos. | Requer 3 argumentos. |
Subtrai o 2º argumento do 1º (data1 − data2). | Subtrai o 2º argumento do 3º (data2 − data1). |
O resultado é expresso como um valor de tempo (e tem as limitações do tipo de dados de tempo). | Resultado é um número inteiro, expresso por um número de unidades conforme fornecido pelo primeiro argumento. |
Aceita expressões de hora ou data e hora. | Aceita expressões de data ou data/hora. |
Ambos os argumentos devem ser do mesmo tipo (time ou datetime). | Ambos os argumentos podem ser de um tipo diferente (data ou data/hora). |
Exemplo 1 – Diferença básica
Aqui está um exemplo que demonstra a diferença básica entre essas funções.
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';
Resultado:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 24:00:00 | -24 | +----------+---------------+
Assim, podemos ver que
TIMEEDIFF()
retornou um valor de tempo e TIMESTAMPDIFF()
retornou um inteiro. Além disso,
TIMEEDIFF()
subtraiu a 2ª data da 1ª, enquanto TIMESTAMPDIFF()
subtraiu a 1ª data da 2ª. Exemplo 2 – Mudando a unidade
Como mencionado,
TIMESTAMPDIFF()
nos permite especificar em qual unidade representar o resultado. Aqui estão alguns exemplos: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';
Resultado:
+----------+-------+---------+---------+ | TIMEDIFF | Hours | Minutes | Seconds | +----------+-------+---------+---------+ | 36:15:35 | -36 | -2175 | -130535 | +----------+-------+---------+---------+
No entanto, aqui está o que acontece se usarmos uma unidade maior que a diferença de tempo real:
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';
Resultado:
+----------+------+-------+--------+ | TIMEDIFF | Days | Weeks | Months | +----------+------+-------+--------+ | 36:15:35 | -1 | 0 | 0 | +----------+------+-------+--------+
Nesse caso, a diferença de horário não foi grande o suficiente para afetar os valores da semana ou do mês.
Exemplo 3 – Tipos de argumentos errados
Aqui está um exemplo do que acontece quando você passa os tipos de argumento errados para cada função.
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';
Resultado:
+---------------+--------------------+ | TIMEDIFF Date | TIMESTAMPDIFF Time | +---------------+--------------------+ | 00:00:00 | NULL | +---------------+--------------------+
O
TIMEDIFF()
não suporta o tipo de dados 'date' e, portanto, retorna 00:00:00
. E o
TIMESTAMPDIFF()
A função não suporta o tipo de dados 'time', então ela retorna NULL
. Exemplo 4 – Tipos de argumentos mistos
Veja o que acontece se você fornecer dois tipos de dados diferentes para cada função.
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';
Resultado:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | -24 | +----------+---------------+
Assim, podemos ver que
TIMESTAMPDIFF()
lida bem com tipos de dados mistos (desde que sejam data ou data e hora). No entanto,
TIMEDIFF()
requer que ambos os argumentos sejam do mesmo tipo, então obtemos NULL
, mesmo que ambos os argumentos sejam de um tipo que a função suporta (hora e data e hora). Podemos confirmar que ambos os tipos são de fato suportados por esta função com o seguinte exemplo:
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';
Resultado:
+----------+----------+ | time | datetime | +----------+----------+ | 02:00:00 | 48:00:00 | +----------+----------+
Portanto, tudo bem, desde que ambos os argumentos sejam do mesmo tipo (valores de hora ou data e hora).