Array
(
)

Como calcular a idade de uma pessoa no SQL Server?

Ferreira
   - 08 jan 2016

Sou iniciante no SQL e estou tendo uma série de dificuldades, entre preciso saber o seguinte:
Em uma consulta SQL, qual a melhor forma de se calcular a idade de uma pessoa em formato inteiro no SQL?

Obrigado!

Joaci Gomes
   - 08 jan 2016

Qual seria o contexto exatamente?

Tenta isso:

SELECT YEAR(dHoje)-YEAR(dNasc)-IIF(MONTH(dHoje)*32+DAY(dHoje)<MONTH(dNasc)*32+DAY(dNasc),1,0)

Pra ñ ter problems c/ o arredondamento, fórmulas, etc...

PS: Depois diz se deu certo?

Ferreira
   - 08 jan 2016

Joaci, obrigado por responder, mas não entendi o porquê do 32, pois um mês não tem 32 dias.

Atenciosamente,

Joaci Gomes
   - 08 jan 2016

Vc pode trok o dHoje por GETDATE() (CURDATE() no MySQL) ou msmo CURRENT_TIMESTAMP qndo for aplikr na base de dad0s. Fiz c/ variáveis o exemplo p/ q se possa testr de maneira fácil usando DECLARE (mas lembre de colocar @ antes das variáveis).

Notas:

Usei 32 como multiplicador do mês apenas como boa prática (potência de 2), mas sendo de 31 pra cima está ok;

Como não consideramos hora no cálculo de idade, o IIF está ajustado p/ que o numero de anos de idade "suba" exatamente no dia do aniversário do usuário;

Lembre-se de que neste caso estamos considerando o aniversário dos nascidos em 29 de fevereiro como sendo 1 de março nos anos não bissextos. Caso prefira de outra forma provavelmente vai ter que acrescentar uma condição especial para isso;

Caso queira usar isso em outros "dialetos" de SQL, como no MySQL por exemplo, troque o IIF por IF.

Alan Mario
   - 08 jan 2016

Como pegar esse valor e salvar, criando um novo campo?

Nilton Braz
   - 08 jan 2016

Segue a expressão:

SELECT FLOOR(DATEDIFF(DAY, DataNascimento, GETDATE()) / 365.25)

Há casos em que se a pessoa faz aniversário no dia seguinte ao dia atual, a query considerando as horas irá informar como se a pessoa já tivesse feito aniversário, quando na verdade não fez (a não ser que ela seja executada exatamente no horário 00:00).

Abraço!

Ferreira
   - 12 jan 2016

Obrigado galera!