Si me permites, estás poniendo cosas inencesarias, y otras ineficientes y peligrosas para la performance.
- Si vas a usar una sola tabla, es innecesario poner el nombre de la tabla delante de cada campo, y sólo sirve apra ensuciar el código. Si quieres usa ALIAS, pero no uses el nombre completo.
- En el contexto de uso de la funcion TIMESTAMDIFF(), este bloque de código es innecesario:
Es inencesario por dos razones: 1) Estás manipulado como cadenas de texto un contenido numérico, lo que obliga a MySQL a hacer conversiones que no se necesitan, y 2) Ese rango ya está incluido en el resultado del uso que te propongo de la función TIMESTAMDIFF().
En todo caso, si lo que quieres es sólo aquellos casos de cumpleaños de los próximos días, tienes que usar las funciones de fecha adecuadas, y no usar esas cadenas de texto. Para tuj caso aplica MAKEDATE(), jjunto con DAYOFYEAR(date), MONTH() y DAY(), o bien otras formas, pero no la que usas.
- Si vas a ordenar por mes y año, ponerlo de este modo es innecesario y falto de optimización:
Código MySQL:
Ver original personal.fecha_nacimiento,'%m %d'
)
es mucho más eficiente manipular los datos en forma numérica que hacerlo como cadenas tde texto. Y los meses y días
son números, no cadenas
Yo te sugiero que lo hagas de este modo:
Código MySQL:
Ver original id_personal,
nombres,
apellido_paterno,
apellido_materno,
estado_civil,
fecha_nacimiento,
genero,
tipo_administrativo
Este sería un modo más preciso.
La primera condicion también la puedes escribir como
Lo que quiero que te quede claro es que es ineficiente hacer comparaciones de datos numéricos como cadenas de texto.