Formatando diferença de horas entre duas datas com SQL

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:

 

Trabalhando com datas no SQL

Como localizar datas consecutivas com SQL

 

Outros conteudos que podem ser de seu interesse

Comandos uteis para trabalhar com tabelas no SQL
15/03/2020SQL

Comandos uteis para trabalhar com tabelas no SQL

Algumas dicas de como listar a quantidade de registros, data de atualização e índices de tabelas no SQL Server e no MySQL

Saiba mais...
Validar CNPJ com SQL Server
24/10/2021SQL

Validar CNPJ com SQL Server

Aprenda a criar uma função para validar o CNPJ utilizando SQL Server

Saiba mais...

Conteúdo sobre banco de dados sem complicação!