Como calcular a diferença entre duas datas no SQL Server

Salve pessoal!

Situação problema deste post

Como calcular a diferença entre duas datas usando Transact-SQL, considerando o mês e o dia das datas envolvidas?

Usando o DATEDIFFa variação de dias é desconsiderada:

E o DATEDIFF também não considera o mês para fazer a diferença:

Somente com o DATEDIFF, portanto, não conseguimos resolver. Esta faz uma subtração dos valores absolutas dos anos das datas, logo, não resolve nosso problema.

Demonstro, a seguir, duas soluções:

  1. Na primeira calculo a diferença em anos entre duas datas (idade) considerando, é claro, o dia do “aniversário” da data comparada.

2. Na segunda calculo e apresento esta diferença em anos, meses e dias destas duas datas.

Calculando a diferença entre duas datas em anos

Para ajustar o calculo da idade em anos, na função Fc_Calcula_Idade é somado -1 caso o mês de início seja igual OU maior que o mês da data final E se o mês for igual, compara-se o dia também.

Testando…

T-SQL – Função [Fc_Calcula_Idade]

Perfeito! Primeira proposta de solução concluída.

Calculando a diferença entre duas datas em anos, mês e dia

Vamos complicar um pouquinho!

Para calcular e apresentar anos, mês e dia resolvi da seguinte forma:

  1. A data do aniversário mais recente, para isso preciso calcular o ano deste aniversário ( @int_Ano_Ultimo_Aniversario ).

A diferença em anos: @int_Qtd_Anos.

A quantidade de meses, desde de o último aniversário:

O último mesversário ( @dt_Ultimo_Mesversario ) para conclui a diferença em dias: @int_Qtd_Dias.

Concateno os valores que serão retornados como VARCHAR.

Testando…

Perfeito!

Já com tratamentos para o mês de fevereiro e os meses de 31 dias. Penso que esta função atenda em vários senários.

Essas funções têm me atendido em algumas demandas.

Espero que sejam úteis e no seu dia-a-dia e no seu aprendizado.

Estejam a vontade em comentar e compartilhar.


Grande abraço, até a próxima.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *