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

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


Duas funções de data incluídas no MySQL são DATEDIFF() e TIMEDIFF() .

Ambas as funções fazem uma coisa semelhante, mas com algumas diferenças significativas.

A tabela a seguir resume a diferença entre essas duas funções:
DATEDIFF() TIMEDIFF()
O resultado é expresso como um valor em dias. O resultado é expresso como um valor de tempo.
Compara apenas o valor de data de seus argumentos. Compara o valor de tempo de seus argumentos.
Aceita expressões de data ou data e hora. Aceita expressões de hora ou data e hora.
Ambos os argumentos podem ser de um tipo diferente (data ou data e hora). Ambos os argumentos devem ser do mesmo tipo (hora ou data e 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 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';

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

Assim, podemos ver que DATEDIFF() retornou 1 , que significa "1 dia", e TIMEDIFF() retornou 24:00:00 que é a representação de tempo de exatamente 1 dia.

Exemplo 2 – Especificando um valor de tempo


Vamos ver o que acontece se aumentarmos o valor de tempo de uma das variáveis.
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';

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

Então DATEDIFF() retorna o mesmo resultado do exemplo anterior. Isso ocorre porque ele compara apenas os valores de data (ignora quaisquer valores de hora).

O TIMEDIFF() A função, por outro lado, compara o tempo e, portanto, retorna um resultado mais preciso. Ele nos mostra que há 36 horas, 15 minutos e 35 segundos entre os dois valores de data e hora.

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

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

O primeiro e o último resultados são bons, porque os tipos de argumento corretos foram passados. No entanto, os dois resultados do meio tiveram o tipo de dados errado passado e, portanto, o resultado correto não pôde ser calculado.

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

Resultado:
+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | NULL     |
+----------+----------+

Assim, podemos ver que DATEDIFF() 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 oferece suporte (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 |
+----------+----------+