Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL TIMEDIFF() vs TIMESTAMPDIFF():Qual é a diferença?


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