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.
Referências:
– pt.stackoverflow.com
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Legal o exemplo porém se você utilizar uma data com uma diferença menor q um minuto ele retorna um minuto de diferença.
Exemplo ‘2020-04-01 08:42:42.400’ e ‘2020-04-01 08:43:00.680’ existe uma diferença de 18 segundos e ela retorna 01:18
Vlw
Entendi jovem, obrigado pelo comentário.
Não tinha testado nesse cenário, vi que no link do stackoverflow que eu citei no artigo, existe um comentário dizendo que conseguiu corrigir, caso queira dar uma olhada – https://pt.stackoverflow.com/a/67890
Abraços jovem
Gostei do exemplo e se no caso for utilizar duas tabelas C5_EMISSÃO COM A F2_EMISSÃO como ficaria o exemplo ?
Obrigado pelo feedback Edson.
Basicamente é necessário:
1. Fazer o join entre a SC5 e SF2 com os campos chave
2. Para não ficar lento, filtramos um pouco no Where, para trazer somente pedidos de setembro
3. Ai no select, você aciona a função, e nos parâmetros passa a comparação entre C5_EMISSAO e F2_EMISSAO
Preparei um exemplo aqui rapidinho, mas não consegui testar, porém a lógica esta prontinha:
Um grande abraço.