ASánchezDíaz

Autoaprendiendo .NET y otras cosas


SQL Server – Crear una “Computed column”

Una interesante característica de SQL Server que probablemente conocéis es la posibilidad de crear “computed columns” en una tabla, esto es, una columna cuyo valor devuelto se obtiene “al vuelo” a partir de valores de otras columnas y expresiones.

En mi caso, tenía una tabla que almacenaba ciertos datos relativos a usuarios. A diseñar la tabla, no pensé que necesitaría una columna “edad”, ya que una columna “fecha_nacimiento” era más recomendable, para obtener la edad a partir del valor almacenado en “fecha_nacimiento”.

Estos días hemos estado desarrollando un sistema de análisis de los datos almacenados en la base de datos, y un dato importante que debemos obtener es la edad de usuario. Lógicamente se podría hacer con código, pero se trata de que la aplicación cargue las tablas y columnas que el usuario decida, por lo que no es muy eficiente determinar cada tabla / columna y hacer algo en función de lo que se elija.

Se trata de una buena cantidad de datos y debería ser todo muy homogéneo: el usuario elige una o varias columnas y la aplicación las relaciona, y estas columnas pueden ser “edad”, “sexo”, “altura”… entre muchísimas otras.

Así que decidí crear la columna “edad” en la tabla “usuarios” y obtener el valor de la edad a partir del valor “fecha_nacimiento”.

Además, el tipo de valor que se guarda en la columna “fecha_nacimiento” es del tipo bigint, porque se trata de un unix timestamp.

Usando la siguiente fórmula hemos resuelto el asunto:

(datediff(year,dateadd(second,[fecha_nacimiento],'1970-01-01 00:00:00'),getdate()))

… a medias, es decir, lo que hacemos es usar la función DATEDIFF para obtener la diferencia en años entre las dos fechas:

DATEDIFF ( datepart , startdate , enddate )

y la función DATEADD porque se trata de un unix timestamp.

El problema es que el valor devuelto es la edad del usuario redondeada, es decir, si la fecha de nacimiento del usuario es el 01-Junio-1990 y hoy es 2 de Junio de 2016, el usuario cumplió ayer 26 años, pero el valor que devuelve es 27, porque redondea hacia arriba.

Para solucionar esto, como podéis imaginar, hemos modificado la formula a:

</span><span>(datediff(year,dateadd(second,[fecha_nacimiento],'1970-01-01 00:00:00'),getdate()) - (1))

Y asunto resuelto 😉

Ya sabéis que estas entradas me sirven para tener una especie de almacén de cosas nuevas que voy aprendiendo, y que creo que seguramente ayuden a alguien más.

Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *