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

Localizar colunas por nome ou tipo de dados no SQL
23/07/2023SQL

Localizar colunas por nome ou tipo de dados no SQL

Descubra como localizar uma coluna por nome ou tipo de dados em qualquer tabela de seu banco de dados

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...
Calculando dias úteis com SQL Server
01/03/2020SQL

Calculando dias úteis com SQL Server

Veja como calcular os dias úteis de acordo com uma determinada data

Saiba mais...

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


Warning: Cannot modify header information - headers already sent by (output started at /home/storage/f/7d/a9/dbins/public_html/blog/post.php:101) in /home/storage/f/7d/a9/dbins/public_html/blog/ga4_track.php on line 11