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