Ver Mensaje Individual
  #10 (permalink)  
Antiguo 15/04/2014, 07:37
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

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:
Código MySQL:
Ver original
  1. DATE_FORMAT(fecha_nacimiento,'%m %d') = DATE_FORMAT(CURDATE(),'%m %d') or
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
  1.         personal.fecha_nacimiento,'%m %d'
  2.     )
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
  1.     id_personal,
  2.     nombres,
  3.     apellido_paterno,
  4.     apellido_materno,
  5.     estado_civil,
  6.     fecha_nacimiento,
  7.     genero,
  8.     tipo_administrativo
  9. FROM personal
  10.     MAKEDATE(YEAR(CURDATE(), DAYOFYEAR(fecha_nacimiento)) BETWEEN CURDATE() AND  ADDDATE(CURDATE(), 10)
  11.     AND TIMESTAMPDIFF(YEAR, fecha_nacimiento, CURDATE()) < TIMESTAMPDIFF(YEAR, fecha_nacimiento, ADDDATE(CURDATE(), 10))
  12. ORDER BY MONTH(fecha_nacimiento), DAY(fecha_nacimiento)
Este sería un modo más preciso.
La primera condicion también la puedes escribir como
Código MySQL:
Ver original
  1. STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-', MONTH(fecha_nacimiento),  '-', DAY(fecha_nacimiento)) BETWEEN CURDATE() AND  ADDDATE(CURDATE(), 10)
Lo que quiero que te quede claro es que es ineficiente hacer comparaciones de datos numéricos como cadenas de texto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)