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