Função que retorna a diferença entre 2 dias e horas no SQL Server

Olá pessoal…

Hoje vou mostrar uma função desenvolvida em SQL Server, que retorna a diferença entre duas datas em Dias, Horas, Minutos e Segundos.

Eu estava procurando uma forma de trazer a diferença entre duas datas e horas no SQL Server para montar um relatório para um usuário, e achei no Stack Overflow uma função interessante divulgada pelo Pedro Lorentz.

A função consiste em receber por parâmetro uma data inicial e uma final, e dentro dela é feito uma tratativa e retornado no formato texto a diferença entre ambas as datas.

Abaixo o código completo da função.

--Criação de Função para Calcular Tempo, que recebe dois parâmetros, a Data Hora Antes e Data Hora Depois
CREATE FUNCTION dbo.fnCalculaTempo 
(
	@antes DATETIME,
	@depois DATETIME
)
RETURNS VARCHAR(20)
AS
BEGIN
	
	--Declara variável temporária
    DECLARE @temp DATETIME;

	--Se o Antes for maior que o Depois, altera as variáveis
    IF (@antes > @depois)
    BEGIN
        SET @temp = @antes;
        SET @antes = @depois;
        SET @depois = @temp;
    END

	--Agora monta a expressão de retorna, se tiver temporária, quer dizer que o valor é negativo (Antes é maior que Depois), seguido por número de dias, horas, minutos  segundos
    RETURN  CASE WHEN @temp IS NULL THEN '' ELSE '-' END
            + CASE WHEN DATEDIFF(DAY, @antes, @depois) <> 0 THEN CONVERT(VARCHAR, DATEDIFF(DAY, @antes, @depois)) + 'd ' ELSE '' END
            + RIGHT('00' + CONVERT(VARCHAR, DATEDIFF(HOUR,   @antes, @depois) % 24), 2) + ':'
            + RIGHT('00' + CONVERT(VARCHAR, DATEDIFF(MINUTE, @antes, @depois) % 60), 2) + ':'
            + RIGHT('00' + CONVERT(VARCHAR, DATEDIFF(SECOND, @antes, @depois) % 60), 2);
END
GO

Após criar a função, basta chamar ela diretamente do seu SELECT, por exemplo, abaixo eu mostro 5 exemplos, com diferenças entre Data, hora, minutos, segundos e um com tudo:

SELECT 
	dbo.fnCalculaTempo(CONVERT(DATETIME, '20180513 08:00:00'), CONVERT(DATETIME, '20180520 08:00:00')) AS EXEMPLO_COM_DIAS,
	dbo.fnCalculaTempo(CONVERT(DATETIME, '20180520 08:00:00'), CONVERT(DATETIME, '20180520 10:00:00')) AS EXEMPLO_COM_HORAS,
	dbo.fnCalculaTempo(CONVERT(DATETIME, '20180520 08:30:00'), CONVERT(DATETIME, '20180520 08:45:00')) AS EXEMPLO_COM_MINUTOS,
	dbo.fnCalculaTempo(CONVERT(DATETIME, '20180520 08:00:19'), CONVERT(DATETIME, '20180520 08:00:49')) AS EXEMPLO_COM_SEGUNDOS,
	dbo.fnCalculaTempo(CONVERT(DATETIME, '20180513 08:30:19'), CONVERT(DATETIME, '20180520 10:45:49')) AS EXEMPLO_GERAL

Abaixo o print exemplificando o uso.

Exemplo de utilização da função

Referências:
pt.stackoverflow.com

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan_Atilio
Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta