SQL

SQL: ¿Quién cumpleaños los próximos 7 días?

En ocasiones nos hemos visto en la necesidad de hacer esta pregunta a nuestra base de datos, el problema habitual es que en el campo de Fecha Nacimiento esta almacenado el año real de la celebración, por lo que compararlo con las fechas actuales resulta un poco “complicado”.

Este sería un ejemplo de una tabla de empleados “básica”:

Nombre FechaNacimiento
Antonio Fernández 14/04/1990
Marisa Paredes 15/02/1965
Adrian López 28/02/1978

La consulta para saber quien cumpleaños en los próximos 7 días seria:

SELECT * FROM Personal
WHERE CONVERT(Date, CONVERT(VarChar(4), Year(Getdate()))
+'/'+ CONVERT(VarChar(2), Month(FechaNacimiento))
+'/'+ CONVERT(VarChar(2), Day(FechaNacimiento)))
BETWEEN GETDATE() AND GETDATE()+7

Realmente lo que hacemos es coger la fecha de nacimiento y sustituir el año de nacimiento por el año de la fecha en curso, con eso conseguimos tener una fecha “actual” y podremos compararlas.

Actualización (17/07/2014):

Después de algunos comentarios que indicaban que la función no era válida cuando el año era bisiesto o el cumpleaños era a finales de año, he modificado la consulta que creo que cubre todos los posibles condicionantes comentados.


SELECT * FROM (SELECT *,
DATEADD(Year, YEAR(GETDATE()) - YEAR(FechaNacimiento), FechaNacimiento) AS ThisYear,
DATEADD(Year, YEAR(GETDATE()) - YEAR(FechaNacimiento)+1, FechaNacimiento) AS NextYear FROM Personal) Nacimientos
WHERE (ThisYear BETWEEN GETDATE() AND GETDATE()+7) OR (NextYear BETWEEN GETDATE() AND GETDATE()+7)