2008-11-12 18 views
8

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?Encontrar la edad de alguien en 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, de 31 de diciembre de 2007' , '01 enero de 2008') retornos 1.

Respuesta

21

Echa un vistazo a este artículo: How to calculate age of a person using SQL codes

Este es 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 
+2

¿Podría realmente poner el código pertinente en su respuesta? Los enlaces a otros sitios web pueden (y se pueden) romper, por lo que en el futuro esta respuesta puede no ser útil si el enlace ya no funciona. –

+0

@Tim C +1 por sugerir agregar código ya que el sitio web está actualmente fuera de servicio y esta respuesta hubiera sido inútil con solo un enlace. –

5

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.

+0

Si reemplaza GETDATE() con un valor estático, golpeará la excepción con mayor frecuencia ya que está revisando a la medianoche. Parece que funcionar desde el mediodía en lugar de la medianoche. – Guvante

2

Fwiw, La edad puede ser calculado de una manera directa y sin recurrir a hacks (no es que haya nada malo con 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 
1

Este espectáculo solución como 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 
1

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

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

Este método no funciona cuando GetDate() es la fecha de nacimiento. Aquí hay un ejemplo donde la persona debería tener 40 años pero solo devuelve 39. 'SELECT datediff (año, '1/29/1973', CAST ('1/29/2013' AS DATETIME) -datepart (dy, '1/29/1973 ')) ' –

+0

¡Gracias! Fijo. ------- – brianary

0

Espero que este sea perfecto siempre que acepte el algoritmo de que un bebé salteño envejece un año más el 29 de febrero sucesivo, o el 1 de marzo en años no bisiestos. @DOB debe contener una fecha dentro de algunos siglos de ahora, @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 

yo realmente va a apreciar cualquier prueba y los comentarios que no he encontrado una manera aún para romperlo ... todavía.

Agregado - 01/31/2014: Éste parece funcionar perfectamente también a pesar de que 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 

Saludos

PD: probablemente se puede modificar la decisión de febrero de 29 a ser un día antes si que flota su barco.

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

una pequeña explicación puede recorrer un largo camino – davejal

Cuestiones relacionadas