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.
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;
Webgrafía.




Comentarios
Publicar un comentario