MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF



Muitas vezes precisamos saber quantos dias se passaram desde que um dado registro entrou no banco de dados ou outros cálculos com datas e horas que precisemos agrupar em dias, meses, horas e etc.

Este tipo de informação geralmente é útil nos processos de limpeza e backup de dados mas também em outras situações como a exibição de dados para um usuário.

Geralmente este procedimento é delegado ao software que lê o banco de dados e realiza as operações necessárias, seja para backup, limpeza ou exibição de dados.

Porém o MySQL possui uma função interessante para efetuar este tipo de procedimento diretamente na query do banco de dados, o que é mais natural já que se trata de um dado.

A função TIMESTAMPDIFF() do MySQL calcula o tempo decorrido entre duas datas que pode ser em dias, meses, minutos e etc.

A lista completa segue abaixo:

FRAC_SECOND (microsegundos),
SECOND (segundos),
MINUTE (minuto),
HOUR (hora),
DAY (dia),
WEEK (semana),
MONTH (mês),
QUARTER (trimestre),
YEAR (ano)

Vamos calcular, por exemplo, quantos dias se passaram desde o registro de alguns dados no banco de dados, baseando-se no momento em que a consulta é feita (ou seja, utilizando a função NOW() como a segunda data ou data de referência):

Tabela padrão - cadastro:


 id | nome   | data  
 1  | Marta  | 2015-03-05 17:05:56  
 2  | Verena | 2015-03-04 17:05:56  
 3  | Pedro  | 2015-03-03 17:07:18  



 SELECT  
      *,  
      TIMESTAMPDIFF(DAY,data,NOW()) AS postado_dias  
 FROM  
      cadastro  

Temos como resposta a tabela abaixo

 id | nome   | data                | postado_dias  
 1  | Marta  | 2015-03-05 17:05:56 | 0  
 2  | Verena | 2015-03-04 17:05:56 | 1  
 3  | Pedro  | 2015-03-03 17:07:18 | 2  

Podemos também utilizar uma data qualquer

 SELECT  
      *,  
      TIMESTAMPDIFF(DAY,data,'2016-03-03 17:07:17') AS postado_dias  
 FROM  
      cadastro  

Temos como resposta a tabela abaixo

 id | nome   | data                 | postado_dias  
 1  | Marta  | 2015-03-05 17:05:56  | 364  
 2  | Verena | 2015-03-04 17:05:56  | 365  
 3  | Pedro  | 2015-03-03 17:07:18  | 365  

Ou mesmo mudar a base de cálculo de dias para meses

 SELECT  
      *,  
      TIMESTAMPDIFF(MONTH,data,'2016-03-03 17:07:18') AS postado_meses  
 FROM  
      cadastro  

Temos como resposta a tabela abaixo

 id | nome   | data                | postado_meses  
 1  | Marta  | 2015-03-05 17:05:56 | 11  
 2  | Verena | 2015-03-04 17:05:56 | 11  
 3  | Pedro  | 2015-03-03 17:07:18 | 12  

Espero que seja útil!
Abraço!

Comentários

Postagens mais visitadas deste blog

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()

MySQL - Clonando tabelas na linha de comando

PHP - Gerando arquivo em UTF-8 com fwrite() e utf8_encode()