SQL Server (T-SQL) función para calcular la edad

Tenemos que diseñar e impartir un curso de Power BI de Microsoft, y queremos mostrar que no solo las fuentes de datos son archivos independientes (de texto delimitado, Excel, etc.)  sino que es posible hacer conexiones con bases de datos, en esta ocasión, del mundo de bases de datos relacionales.

Consultando con el chatbot IA de Copilot - para que la cuña apriete tiene que ser mismo árbol - se recomendó la base de datos también de casa, en su versión Express, SQL Server 2025.

"SQL Server Express Edition es la base de datos gratuita de nivel de entrada, ideal para aprender y compilar aplicaciones controladas por datos de escritorio y servidor pequeño. Esta edición unificada incluye SQL Server Data Tools (SSDT), integración de aprendizaje automático y Búsqueda de texto completo. Es la mejor opción para proveedores de software independientes, desarrolladores y aficionados que crean aplicaciones cliente. Si necesita características de base de datos más avanzadas, SQL Server Express se puede actualizar sin problemas a otras ediciones de gama superior de SQL Server." (Microsoft, s.f.)

Adicionalmente para facilitar la administración de las bases de datos más allá de la consola es instalar un producto adicional como es SQL Server Management Studio que es el Entorno de Desarrollo Integrado pudiéramos decir que es el estándar de este producto.

Si los tiempos dan, escribiré otro artículo donde detallaré la puesta en marcha del motor. En este caso el motor ya esta corriendo e inclusive se han cargado datos de un registro administrativo.

Tenemos un problema común y que debe haber mucho código que resuelve esto, es el calculo de la edad en base a la fecha de nacimiento y una fecha de referencia.

Una tabla tiene una columna llamada FEC_NAC con el detalle que existen algunos valores nulos o vacíos.


El tipo de dato es datetime2 con lo cual podemos usar las funciones que tiene SQL Server para el manejo de fechas.

Hoy día, dado que existe la inteligencia artificial es poco eficiente y nos vuelve nuevamente a esto de que ya no tiene caso  "inventar la rueda", Copilot manda el siguiente código:

USE BD;

GO

CREATE OR ALTER FUNCTION dbo.fn_calcular_edad

(

-- Add the parameters for the function here

@FEC_NAC datetime2,

@FEC_REF Date

)

RETURNS int

AS

BEGIN

-- Declare the return variable here

DECLARE @EDAD int;

SET @EDAD = DATEDIFF(YEAR, @FEC_NAC, @FEC_REF)

- CASE

WHEN DATEADD(YEAR, DATEDIFF(YEAR, @FEC_NAC, @FEC_REF), @FEC_NAC) > @FEC_REF

THEN 1

ELSE 0

END;

RETURN @EDAD;

END

El IDE en mi caso esta configurado en español entonces en la ventana de "Explorador de objetos" vamos a la sección (o carpeta) y se expanden Programación-Funciones y se coloca en Funciones escalares.



Es obvio que aquí no tenemos problemas y quizás lo único es que no aparecía ligada la función a la base de datos por lo que la solución fue desconectar y conectar la base de datos, y así pareció la función para poder calcular la edad.

Un aspecto importante es invocar la función para que calcule la edad en base a una fecha de referencia, aquí una sentencia SELECT que hará el calculo de la edad.

USE BD;

GO

SELECT dbo.fn_calcular_edad(FEC_NAC, TRY_CONVERT(date,'31/03/2021',103)) AS EDAD FROM dbo.tabla WHERE FEC_NAC IS NOT NULL;

Al principio fue buscar como convertir una cadena de tipo dd/mm/aaaa al tipo de dato que requiere la función que es date, para ello se usa la función TRY_CONVERT() el primer parámetro es al tipo de dato que se convertirá la cadena que es el segundo parámetro, por último el 103 es la forma en que se envía la cadena de fecha que en este caso es día-mes y año.

Se puede observar que el resultado de la consulta es la edad calculada en base a la fecha de nacimiento al 31 de marzo del 2021.


Ahora lo interesante de la función, sin duda ahora las diferentes funciones de muchas lenguajes de programación facilitan mucho los diferentes casos de uso que existen en el desarrollo para este caso es el conjunto de las que trabajan con fechas.

SET @EDAD = DATEDIFF(YEAR, @FEC_NAC, @FEC_REF)


Con la función DATEDIFF() hace una resta entre dos fechas y el primer parámetro es la unidad en la que se representará la diferencia que en este caso es en años (YEAR).

Pero este dato se cumple siempre y cuando la fecha de cumpleaños sea posterior a la de referencia, esta verificación se hace con las siguientes instrucciones:

 CASE

WHEN DATEADD(YEARDATEDIFF(YEAR, @FEC_NAC, @FEC_REF), @FEC_NAC) > @FEC_REF

THEN 1

ELSE 0

END;

 Aquí nuevamente se calcula la diferencia en años entre las dos fechas para que esta cifra sea sumada a con DATEADD() y la fecha de nacimiento sea igualada con la de referencia en relación con el año, si esta fecha es mayor a la de referencia significa que ya pasó la fecha de cumpleaños y con ello se agrega un 0, en caso contrario se resta con 1 la edad.

Una cosa interesante y para mi rara, es que en el editor de scripts marcaba en rojo como si no se reconociera la función fn_calcular_edad() y Copilot dio la siguiente solución que entrar a la opción del menú Editar-IntelliSense-Actualizar caché local, como se muestra en la siguiente imagen:


Con esto ya queda reconocida la función que se programó para calcular la edad.

Hasta el siguiente artículo.

Miguel Araujo.

Webgrafía.

Microsoft. (s. f.). Ediciones y componentes de SQL Server 2025. Microsoft Learn.
https://learn.microsoft.com/es-es/sql/sql-server/editions-and-components-of-sql-server-2025?view=sql-server-ver17 

Comentarios

Entradas populares de este blog

Visual Studio Code con Python usando base de datos de Oracle

Después de Xamarin - .NET MAUI para aplicaciones móviles (y multiplataforma)

Sonidos en .NET MAUI y la duda sobre Miriam