New question

Question:

Date: 07-04-2018 15:32:04 (In Spanish)

Funcion en SQL para obtener la edad[Resolved]

Hola a tod@s, quería compartirles una función que hice para en SQL que sirve para obtener la edad de una persona, teniendo en cuenta los años biciestos.

Les quería compartir esto ya que me di cuenta que en muchos foros hay preguntas similares pero no están contestadas o no funcionan como esperaba.


USE [TuBD]
GO
/****** Object:  UserDefinedFunction [dbo].[GetEdad]    Script Date: 04/07/2018 08:42:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        SANTILLÁN, Esteban Antonio
-- Create date: 07-04-2018
-- Description:    Retorna la cantidad de años (edad) a partir de una fecha proporcionada, en formato 'YYYY-MM-DD'
-- =============================================
ALTER FUNCTION [dbo].[GetEdad]
(
    @FechaNacimiento DATE
)
RETURNS TINYINT
AS
BEGIN
    DECLARE @FechaActual DATE = GETDATE();
    DECLARE @AnioNacimiento INT = YEAR(@FechaNacimiento), @AnioActual INT = YEAR(@FechaActual), @CantAniosBiciestos TINYINT = 0;
    DECLARE @AuxAnio INT = @AnioNacimiento;

    WHILE @AuxAnio <= @AnioActual
    BEGIN
        /*
        * Años Biciestos:
        * .Cada 4 años
        * .Pero no cada 100
        * .Pero sí cada 400 (Ej: 2000 es divisible por 4 por lo que sí sería año biciesto, pero también es divisible por 100, por lo que no pero también es divisible por 400, por lo que finalmente fue año biciesto)
        */
        IF (@AuxAnio % 4 = 0)-- AND NOT (@AuxAnio % 100 = 0)) OR (@AuxAnio % 100 = 0)--lo dejo comentado porque estas últimas dos condiciones, sólo se evaluarían los años divisibles por 100 y, como sé que el 2000 fue año biciesto, no tiene caso desperdiciar recursos...a no ser que necesiten obtener la cantidad de años transcurridos de,por ejemplo, un hecho histórico
        BEGIN
            SET @CantAniosBiciestos = @CantAniosBiciestos + 1;
        END
        
        SET @AuxAnio = @AuxAnio + 1;
    END

    RETURN (SELECT DATEDIFF(DAY,DATEADD(DAY,@CantAniosBiciestos,@FechaNacimiento),@FechaActual) / 365);
END


Para invocarla podrían ejecutar algo como:

SELECT dbo.GetEdad('1900-01-01');


Saludos.

PD: En el trabajo utilizo MSSQLServer 2008 r2 pero no debería ser muy dificil traducirla para otros SGBD, no obstante, si necesitan ayuda para traducirla a MySQL u Oracle les puedo dar una mano.
Tags: Input - MSSQL - SQL - SQL Function - SQL Server - Transact-SQL Votes: 3 - Answers: 2 - Views: 18 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com