none
Calcular Edad

    Question

  • Buenas tardes tengo el siguiente query que me muestra el nombre de la persona y su fecha de nacimiento como podria calcular la edad de esta persona?

    SELECT prs_nombrecompleto,prs_fecnac FROM Personas

    Wednesday, July 24, 2013 7:43 PM

Answers

  • Hola prueba de esta forma

    SELECT prs_nombrecompleto,prs_fecnac,(CAST(DATEDIFF(mm,prs_fecnac,GETDATE())/12 AS INT)) AS Edad FROM Personas


    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    • Marked as answer by JasonBean Wednesday, July 24, 2013 8:09 PM
    Wednesday, July 24, 2013 7:46 PM
  • Aqui tienes un ejemplo.

    USE tempdb;
    GO
    CREATE FUNCTION dbo.ufn_CalcEdad (
    @fecha_nac date
    )
    RETURNS TABLE
    AS
    RETURN (
    SELECT DATEDIFF([year], @fecha_nac, GETDATE()) - CASE WHEN (MONTH(GETDATE()) * 100) + DAY(GETDATE()) < (MONTH(@fecha_nac) * 100) + DAY(@fecha_nac) THEN 1 ELSE 0 END AS Edad
    );
    GO
    SELECT
    	T.fecha_nac,
    	F.Edad
    FROM
    	(
    	VALUES 
    		(CAST('19871010' AS date)),
    		(CAST('19870710' AS date))
    	) AS T(fecha_nac)
    	OUTER APPLY
    	dbo.ufn_CalcEdad(T.fecha_nac) AS F	;
    GO
    SELECT
        name,
        object_id,
        principal_id,
        schema_id,
        parent_object_id,
        type,
        type_desc,
        create_date,
        modify_date,
        is_ms_shipped,
        is_published,
        is_schema_published
    FROM
    	sys.objects
    WHERE
    	[type] = 'IF'
    GO
    DROP FUNCTION dbo.ufn_CalcEdad;
    GO

    Es importante notar que uso una funcion en linea tipo tabla, ya que el uso de este tipo tiende a tener mejor desempeño que las funciones escalares.


    AMB

    Some guidelines for posting questions...

    • Marked as answer by JasonBean Friday, July 26, 2013 11:02 PM
    Thursday, July 25, 2013 1:29 PM

All replies

  • Hola prueba de esta forma

    SELECT prs_nombrecompleto,prs_fecnac,(CAST(DATEDIFF(mm,prs_fecnac,GETDATE())/12 AS INT)) AS Edad FROM Personas


    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    • Marked as answer by JasonBean Wednesday, July 24, 2013 8:09 PM
    Wednesday, July 24, 2013 7:46 PM
  • SELECT prs_nombrecompleto,
    prs_fecnac,
    DateDiff(Year,prs_fecnac,GetDate()) Edad

    FROM Personas;


    El castellano no es mi lengua materna. Discúlpenme por los errores gramaticales, y, si pueden, corríjanme en los comentarios, o por correo electrónico. ¡Muchas gracias! Blog: http://about.me/GeriReshef


    • Edited by Geri_ReshefMVP Wednesday, July 24, 2013 7:58 PM Pasar linea
    Wednesday, July 24, 2013 7:57 PM
  • gracias por sus respuesta el query de Jose es mas exacto puesto que en mi base de datos tengo una persona nacida en agosto de 1987 y con el query de Jose sale que tiene 25 años pero con el query que propones Geri sale 26 años de todas formas muchas gracias
    Wednesday, July 24, 2013 8:09 PM
  • Tienes que tomar en cuenta el mes y dia donde haces el calculo, ya que la funcion DATEDIFF([year], fecha_nacimiento, GETDATE()) da la diferencia en años y no en dias convertidos a años.

    SELECT
    	fecha_nac,
    	DATEDIFF([year], fecha_nac, GETDATE()) - CASE WHEN (MONTH(GETDATE()) * 100) + DAY(GETDATE()) < MONTH(fecha_nac) * 100 + DAY(fecha_nac) THEN 1 ELSE 0 END AS edad
    FROM
    	(
    	VALUES 
    		(CAST('19871010' AS date)),
    		(CAST('19870710' AS date))
    	) AS T(fecha_nac);


    En palabras seria algo asi como calcular el añ usando DATEDIFF y restar 1 si el mes y dia de hoy es menor al mes y dia del cumpleaños.

    AMB

    Some guidelines for posting questions...

    Wednesday, July 24, 2013 8:37 PM
  • si funciona bien ahora me surge la siguiente duda como podria hacer una funcion que reciba como parametro la fecha de nacimiento y me retorne le edad

    Wednesday, July 24, 2013 8:40 PM
  • Aqui tienes un ejemplo.

    USE tempdb;
    GO
    CREATE FUNCTION dbo.ufn_CalcEdad (
    @fecha_nac date
    )
    RETURNS TABLE
    AS
    RETURN (
    SELECT DATEDIFF([year], @fecha_nac, GETDATE()) - CASE WHEN (MONTH(GETDATE()) * 100) + DAY(GETDATE()) < (MONTH(@fecha_nac) * 100) + DAY(@fecha_nac) THEN 1 ELSE 0 END AS Edad
    );
    GO
    SELECT
    	T.fecha_nac,
    	F.Edad
    FROM
    	(
    	VALUES 
    		(CAST('19871010' AS date)),
    		(CAST('19870710' AS date))
    	) AS T(fecha_nac)
    	OUTER APPLY
    	dbo.ufn_CalcEdad(T.fecha_nac) AS F	;
    GO
    SELECT
        name,
        object_id,
        principal_id,
        schema_id,
        parent_object_id,
        type,
        type_desc,
        create_date,
        modify_date,
        is_ms_shipped,
        is_published,
        is_schema_published
    FROM
    	sys.objects
    WHERE
    	[type] = 'IF'
    GO
    DROP FUNCTION dbo.ufn_CalcEdad;
    GO

    Es importante notar que uso una funcion en linea tipo tabla, ya que el uso de este tipo tiende a tener mejor desempeño que las funciones escalares.


    AMB

    Some guidelines for posting questions...

    • Marked as answer by JasonBean Friday, July 26, 2013 11:02 PM
    Thursday, July 25, 2013 1:29 PM