Formatando diferença de horas entre duas datas com SQL
Neste artigo vamos ver como calcular a diferença de horas entre dois campos data e hora utlizando SQL. Vamos ver exemplos utilizando MySQL e SQL Server.
Antes de começar, vamos criar a tabela que vai servir de referência para nossos exemplos.
MySQL
CREATE TABLE controle_entrada (
id int NOT NULL AUTO_INCREMENT,
nome varchar(255),
entrada DATETIME,
saida DATETIME,
PRIMARY KEY (id)
);
SQL Server
CREATE TABLE controle_entrada (
id int IDENTITY(1,1) PRIMARY KEY,
nome varchar(255),
entrada DATETIME,
saida DATETIME
);
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("Pedro", "2024-09-10 08:00:00", "2024-09-10 17:00:00");
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("Tiago", "2024-09-10 09:35:00", "2024-09-10 18:10:00");
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("João", "2024-09-11 10:12:00", "2024-09-11 17:05:00");
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("Matheus", "2024-09-11 17:12:00", "2024-09-11 21:05:00");
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("Simão", "2024-09-11 18:12:00", "2024-09-11 23:05:00");
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("Bartolomeu", "2024-09-11 12:12:00", "2024-09-11 19:05:00");
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("João", "2024-09-12 18:12:00", "2024-09-13 04:03:00");
INSERT INTO controle_entrada (nome, entrada, saida) VALUES ("André", "2024-09-10 09:11:00", "2024-09-10 17:33:00");
Nosso objetivo é obter o retorno no formato hora:minuto. para gerar num relatório da diferença de tempo entre a entrada e a saída. Tomando como base o primeiro registro, que possui as seguintes informações:
Entrada: "2024-09-10 08:00:00"
Saída: "2024-09-10 17:00:00"
O retorno desejado é "09:00"
Para obter isso vamos precisar obter a diferença em minutos entre estes horários e fazer o cálculo dividindo o resultado por 60. Para o cálculo de horas, podemos fazer da seguinte forma:
MySQL
SELECT nome, FLOOR(TIMESTAMPDIFF(MINUTE, entrada, saida) / 60) as horas FROM controle_entrada
SQL Server
SELECT nome, FLOOR(DATEDIFF(MINUTE, entrada, saida) / 60) as horas FROM controle_entrada
No MySQL a função TIMESTAMPDIFF permite calcular a diferença entre dois campos data e hora. Seu primeiro parâmetro é o formato do resultado, o segundo é a data hora inicial e o último é a data_hora final. Como o retorno da divisão por 60 pode não dar um número inteiro, arredondamos o resultado para baixo utilizando a função FLOOR.
No SQL Server a lógica é semelhante, o que muda é que o nome da função que calcula a diferença entre as datas é diferente. Ao invés de TIMESTAMPDIFF, utilizamos a função DATEDIFF, que também recebe 3 parâmetros, formato do resultado,data hora inicial e data_hora final.
Para calcular a diferença em minutos fazemos algo parecido. A única diferença é que ao invés de dividir por 60 nós vamos utilizar o resto da divisão por 60. Para isso, ao invés do operador de divisão vamos utilizar o operador %.
MySQL
SELECT nome, TIMESTAMPDIFF(MINUTE, entrada, saida) % 60 as minutos FROM controle_entrada
SQL Server
SELECT nome, DATEDIFF(MINUTE, entrada, saida) % 60 as minutos FROM controle_entrada
Uma outra diferença em relação ao cálculo da hora é que não vamos precisar arredandar o resultado para baixo.
Com base no que vimos, podemos formatar o retorno da forma como queremos. Nosso objetivo é juntar o cálculo da hora e dos minutos, separados por ":". Tanto hora como minuto devem ser exibidos com 2 dígitos, então vamos precisar acrescentar zeros a esquerda para o caso do resultado do cálculo ser menor que 10. Nossa consulta final ficaria da seguinte forma:
MySQL
SELECT nome, entrada, saida,
CONCAT(
LPAD(FLOOR(TIMESTAMPDIFF(MINUTE, entrada, saida) / 60), 2, "0"),
':',
LPAD(TIMESTAMPDIFF(MINUTE, entrada, saida) % 60, 2, "0")
) AS diferenca_hora_minuto
FROM controle_entrada;
SQL Server
SELECT
nome,
entrada,
saida,
CONCAT(
FORMAT(FLOOR(DATEDIFF(MINUTE, entrada, saida) / 60), '00'),
':',
FORMAT(DATEDIFF(MINUTE, entrada, saida) % 60, '00')
) AS diferenca_hora_minuto
FROM
controle_entrada;
No MySQL para gerar um resultado com 2 dígitos utilizamos a funão LPAD que acrescentou um zero a esquerda para os casos onde o cálculo gerou um resultado menor que 10. Ela recebe 3 parâmetros, o campo ou expressão, a quantidade de caracteres que deve ser retornada e o caractere usado para preencher a esquerda.
Já no SQL Server utilizamos a função FORMAT para que o resultado do cálculo fosse exibido com dois digitos.
Para concatenar a hora, o separador e os minutos, foi utilizada a função CONCAT(), essa função é comum no MySQL e SQL Server.
Encerramento
Neste artigo você aprendeu como formatar a diferença em hora:minuto entre dois campos data e hora no SQL.
Se você se interessou por este assunto, os links a seguir podem ser de seu interesse: