Obter idade
Por alguma razão, parece que acabamos em uma enorme quantidade de projetos em que as datas são comparadas. Durante esse período, desenvolvemos várias funções para acelerar e garantir a integridade desses dados.
A razão pela qual criamos isso foi que trabalhar em uma era em que alguém nasceu em um ano bissexto pode terminar com uma variação de um dia. Em um ano bissexto, 29/02 é o mesmo dia do ano que 01/03.
Usamos duas datas, pois permite que você datilografe a hora em que você precisou a idade (como uma data de falecimento) e só será padronizada na data atual se for deixada em branco.
Como não acreditamos em reinventar a roda, deixamos nosso código aqui para quem achar útil. Isso requer uma função secundária vinculada abaixo.
CREATE FUNCTION Dates.GetAge(@Date DATETIME2,@Until DATETIME2) RETURNS INT AS BEGINIF @Until IS NULL SET @Until=CONVERT(DATE,GETDATE())DECLARE @Age INT=DATEDIFF(YEAR,@Date,@Until)+(CASE WHEN DATEPART(DAYOFYEAR,@Date)>(DATEPART(DAYOFYEAR,@Until)+(CASE WHEN dbo.GetLeapYear(@Until)=1 AND DATEPART(DAYOFYEAR,@Until)>59 THEN -1 ELSE 0 END))THEN -1 ELSE 0 END)RETURN @AgeENDGO
SELECT Dates.GetAge('2011-02-28','2013-02-27'),Dates.GetAge('2011-02-28','2013-02-28'),Dates.GetAge('2011-02-28','2013-03-01'),Dates.GetAge('2011-02-28','2013-03-02')SELECT Dates.GetAge('2011-02-28','2012-02-27'),Dates.GetAge('2011-02-28','2012-02-28'),Dates.GetAge('2011-02-28','2012-02-29'),Dates.GetAge('2011-02-28','2012-03-01')SELECT Dates.GetAge('2012-02-28','2013-02-27'),Dates.GetAge('2012-02-28','2013-02-28'),Dates.GetAge('2012-02-28','2013-03-01'),Dates.GetAge('2012-02-28','2013-03-02')SELECT Dates.GetAge('2012-02-29','2013-02-27'),Dates.GetAge('2012-02-29','2013-02-28'),Dates.GetAge('2012-02-29','2013-03-01'),Dates.GetAge('2012-02-29','2013-03-02')
Até agora, os testes não revelaram anomalias. No entanto, informe-nos se encontrar algum.