meses exacta edad datos como calcular actual sql sql-server tsql

exacta - calcular la edad sql server 2008



Encontrar la edad de alguien en SQL (7)

Mira este artículo: Cómo calcular la edad de una persona usando códigos SQL

Aquí está el código del artículo:

DECLARE @BirthDate DATETIME DECLARE @CurrentDate DATETIME SELECT @CurrentDate = ''20070210'', @BirthDate = ''19790519'' SELECT DATEDIFF(YY, @BirthDate, @CurrentDate) - CASE WHEN( (MONTH(@BirthDate)*100 + DAY(@BirthDate)) > (MONTH(@CurrentDate)*100 + DAY(@CurrentDate)) ) THEN 1 ELSE 0 END

En una base de datos de SQL Server, registro la fecha de nacimiento de las personas. ¿Existe un método sencillo de calcular la edad de la persona en una fecha determinada utilizando solo SQL?

El uso de DATEDIFF (AÑO, DateOfBirth, GETDATE ()) no funciona, ya que solo considera la parte del año de la fecha. Por ejemplo, DATEDIFF (AÑO, ''31 de diciembre de 2007 '', ''01 de enero de 2008'') devuelve 1.


Hay otra manera que es un poco más simple:

Select CAST(DATEDIFF(hh, [birthdate], GETDATE()) / 8766 AS int) AS Age

Debido a que el redondeo aquí es muy granular, esto es casi perfectamente exacto. Las excepciones son tan intrincadas que son casi cómicas: cada cuarto año la edad devuelta será un año demasiado joven si A) preguntamos por la edad antes de las 6:00 AM, B) en el cumpleaños de la persona y C) su cumpleaños es después 28 de febrero. En mi entorno, este es un compromiso perfectamente aceptable.


FWIW, Age se puede calcular de manera directa sin recurrir a hacks (¡no es que haya nada de malo en los hacks!):

CREATE FUNCTION Age (@BirthDate DATETIME) RETURNS INT AS BEGIN DECLARE @AgeOnBirthdayThisYear INT DECLARE @BirthdayThisYear DATETIME SET @AgeOnBirthdayThisYear = DATEDIFF(year, @BirthDate, GETDATE()) SET @BirthdayThisYear = DATEADD(year, @AgeOnBirthdayThisYear, @BirthDate) RETURN @AgeOnBirthdayThisYear - CASE WHEN @BirthdayThisYear > GETDATE() THEN 1 ELSE 0 END END


Esta solución muestra cómo en una consulta sin variables

SELECT DATEDIFF(YY, birthdate, GETDATE()) - CASE WHEN( (MONTH(birthdate)*100 + DAY(birthdate)) > (MONTH(GETDATE())*100 + DAY(GETDATE())) ) THEN 1 ELSE 0 END


Esto es más conciso y un poco más rápido que las respuestas proporcionadas, y completamente exacto:

datediff(year,DateOfBirth,getdate()-datepart(dy,DateOfBirth)+1)


Espero que este sea perfecto siempre que acepte el algoritmo de que un bebé salta un año más tarde el 29 de febrero sucesivo, o el 1 de marzo en años no bisiestos. @DOB debe contener una fecha dentro de unos pocos siglos, @AsOf debe contener una fecha similar> = @DOB:

SET @Age = YEAR(@AsOf) - YEAR(@DOB) - 1 IF MONTH(@AsOf) * 100 + DAY(@AsOf) >= MONTH(@DOB) * 100 + DAY(@DOB) SET @Age = @Age + 1

VERDADERAMENTE agradecería cualquier prueba y comentario ya que aún no he encontrado la manera de romperlo ... todavía.

Agregado - 31/01/2014: Este parece funcionar perfectamente también, aunque a primera vista parece demasiado crudo:

SET @Age = FLOOR(DATEDIFF(dd,@DOB,@CompareDate)/365.25)

Pop estos en una función y aquí hay un script de prueba:

SELECT dbo.fnGetAge(''2/27/2008'', ''2/27/2012'') SELECT dbo.fnGetAge(''2/27/2008'', ''2/28/2012'') SELECT dbo.fnGetAge(''2/27/2008'', ''2/29/2012'') SELECT dbo.fnGetAge(''2/27/2008'', ''3/1/2012'') -- 4 4 4 4 SELECT dbo.fnGetAge(''2/28/2008'', ''2/27/2012'') SELECT dbo.fnGetAge(''2/28/2008'', ''2/28/2012'') SELECT dbo.fnGetAge(''2/28/2008'', ''2/29/2012'') SELECT dbo.fnGetAge(''2/28/2008'', ''3/1/2012'') -- 3 4 4 4 SELECT dbo.fnGetAge(''2/29/2008'', ''2/27/2012'') SELECT dbo.fnGetAge(''2/29/2008'', ''2/28/2012'') SELECT dbo.fnGetAge(''2/29/2008'', ''2/29/2012'') SELECT dbo.fnGetAge(''2/29/2008'', ''3/1/2012'') -- 3 3 4 4 SELECT dbo.fnGetAge(''3/1/2008'', ''2/27/2012'') SELECT dbo.fnGetAge(''3/1/2008'', ''2/28/2012'') SELECT dbo.fnGetAge(''3/1/2008'', ''2/29/2012'') SELECT dbo.fnGetAge(''3/1/2008'', ''3/1/2012'') -- 3 3 3 4 SELECT dbo.fnGetAge(''3/1/2007'', ''2/27/2012'') SELECT dbo.fnGetAge(''3/1/2007'', ''2/28/2012'') SELECT dbo.fnGetAge(''3/1/2007'', ''2/29/2012'') SELECT dbo.fnGetAge(''3/1/2007'', ''3/1/2012'') -- 4 4 4 5 SELECT dbo.fnGetAge(''3/1/2007'', ''2/27/2013'') SELECT dbo.fnGetAge(''3/1/2007'', ''2/28/2013'') SELECT dbo.fnGetAge(''3/1/2007'', ''3/1/2013'') SELECT dbo.fnGetAge(''2/27/2007'', ''2/28/2013'') SELECT dbo.fnGetAge(''2/28/2007'', ''2/28/2014'') -- 5 5 6 6 7

Aclamaciones

PD: Probablemente puedas modificar la decisión del 29 de febrero de ser un día antes si eso hace flotar tu bote.


SELECT Pname, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age FROM tablename