Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Consulta mysql para calcular los cumpleañeros de la semana?

Estas en el tema de Consulta mysql para calcular los cumpleañeros de la semana? en el foro de Mysql en Foros del Web. Saludos comunidad: estos dias estoy teniendo problemas con una consulta q no puedo resolverlo correctamente y acudo a la comunidad para que me puedan ayudar... ...
  #1 (permalink)  
Antiguo 10/04/2014, 13:18
 
Fecha de Ingreso: marzo-2007
Mensajes: 17
Antigüedad: 17 años, 1 mes
Puntos: 0
Pregunta Consulta mysql para calcular los cumpleañeros de la semana?

Saludos comunidad:

estos dias estoy teniendo problemas con una consulta q no puedo resolverlo correctamente y acudo a la comunidad para que me puedan ayudar...

con esta simple consulta puedo calcular los cumpleaños del dia:
SELECT .... FROM TABLA WHERE DATE_FORMAT(mi_campo_de_fechas, '%m%d') = DATE_FORMAT(CURDATE(),'%m%d');

y me anda perfecto esa consulta para optener todos los cumpleañeros del dia.

PERO: ahora como puedo calcular todos los cumpleañeros de las semana? o bien desde la fecha actual hasta los proximos 10dias? todos esos cumpleaños con una sola consulta?....

por favor ayuda?
  #2 (permalink)  
Antiguo 10/04/2014, 15:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

Hola djdonovans:

Hay muchas formas de obtener la consulta que planteas, una de ellas es utilizando la función DATEDIFF, que te regresa la diferencia en días entre dos fechas. Si la diferencia entre la fecha actual y la fecha en que una persona cumple años es menor o igual a 10, obtienes lo que esperas.

Mucho ojo, el detalle en qué almacenas en tu campo mi_campo_de_fechas, puedo suponer que se trata la fecha de nacimiento, por lo tanto NO PUEDES COMPARAR DIRECTAMENTE CONTRA SEA FECHA, sino que tienes que considerar el año en curso:

Si mi fecha de nacimiento es el 21 de diciembre de 1980 (1980-12-21), mi fecha de cumpleaños para el 2014 sería (2014-12-21).

En tu ejemplo ya utilizas la función DATE_FORMAT para extraer la parte de la fecha que te interesa, eso mismo te puede servir:

Código MySQL:
Ver original
  1. mysql> select  DATE_FORMAT('1980-12-21', '%Y-%m-%d') mi_fecha_de_nacimiento,
  2.     -> DATE_FORMAT('1980-12-21', '2014-%m-%d') mi_fecha_de_cumpleaños;
  3. +------------------------+-------------------------+
  4. | mi_fecha_de_nacimiento | mi_fecha_de_cumpleaños  |
  5. +------------------------+-------------------------+
  6. | 1980-12-21             | 2014-12-21              |
  7. +------------------------+-------------------------+
  8. 1 row in set (0.02 sec)

Observa, la fecha de "entrada" es la misma... el chiste es el formato que le colocas... Obviamente este ejemplo es válido sólo para este año... pero tienes muchas otras funciones de fecha y hora que te sirven para cambiar esto para cualquier año (por ejemplo YEAR :P).

Haz el intento y nos comentas, si tienes problemas postea algo de lo que intentaste hacer y con gusto te ayudamos a corregir la consulta.

Saludos
Leo
  #3 (permalink)  
Antiguo 10/04/2014, 15:41
 
Fecha de Ingreso: marzo-2007
Mensajes: 17
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

gracias por responder : leonardo_josue

pero como indique en el problema que tengo bueno lo voy a especificar mejor:

tengo en un campo una infinidad de fechas(tipo:DATE) de cientos de usuarios ahora con las consulta que indique logre sacar todos los cumpleaños del dia de ese campo...

1) ahora yo necesito sacar todas las fechas de cumpleaños de la semana.
2) o sacar a partir del dia los proximos 10 dias que cumpliran todos los usuarios que tenga sus cumpleaños....

estare muy agradecido por sus ayudas y consejos
  #4 (permalink)  
Antiguo 11/04/2014, 07:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

Lista de los que cumpliran dentro de los proximos 10 dias.

Código MySQL:
Ver original
  1. SELECT ....
  2. FROM TABLA
  3. WHERE DATE(CONCAT_WS("-",YEAR(CURDATE()),MONTH(mi_campo_de_fechas),DAY(mi_campo_de_fechas))
  4.           BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 10 DAY);

Los de la misma semana

Código MySQL:
Ver original
  1. SELECT ....
  2. FROM TABLA
  3.       WEEK(DATE(CONCAT_WS("-",YEAR(CURDATE()),MONTH(mi_campo_de_fechas),DAY(mi_campo_de_fechas)))
  4.                    =WEEK(CURDATE());


Código MySQL:
Ver original
  1. WHERE (DATE(CONCAT_WS("-",YEAR(CURDATE()),MONTH(mi_campo_de_fechas),DAY(mi_campo_de_fechas))
  2.           BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 10 DAY))
  3. (WEEK(DATE(CONCAT_WS("-",YEAR(CURDATE()),MONTH(mi_campo_de_fechas),DAY(mi_campo_de_fechas)))
  4.                    =WEEK(CURDATE()))


Ojo con los cumpleaños de los últimos y de los primeros días del año. Y los que hayan nacido en febrero de un año bisiesto....


Con el Manual podrás afinar el resultado.(Ojo que WEEK() tiene un segundo parámetro para decidir que día empieza la semana....)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 11/04/2014 a las 07:25
  #5 (permalink)  
Antiguo 11/04/2014, 13:19
 
Fecha de Ingreso: marzo-2007
Mensajes: 17
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

muchas gracias quimfv:

implemente tu ayuda pero no me funciono :( aca muestro todo el codigo q estoy trabajando y donde me funciona para extraer los cumpleañeros del dia
Código MySQL:
Ver original
  1.     personal.id_personal,
  2.     personal.nombres,
  3.     personal.apellido_paterno,
  4.     personal.apellido_materno,
  5.     personal.estado_civil,
  6.     personal.fecha_nacimiento,
  7.     personal.genero,
  8.     personal.tipo_administrativo
  9.     personal
  10.  DATE_FORMAT(fecha_nacimiento,'%m %d') = DATE_FORMAT(CURDATE(),'%m %d')
  11.         personal.fecha_nacimiento,'%m %d'
  12.     )


1) ahora yo necesito sacar todas las fechas de cumpleaños de la semana.
2) o sacar a partir del dia los proximos 10 dias que cumpliran todos los usuarios que tenga sus cumpleaños....

Última edición por djdonovans; 11/04/2014 a las 13:26
  #6 (permalink)  
Antiguo 15/04/2014, 03:37
 
Fecha de Ingreso: agosto-2013
Ubicación: Talca
Mensajes: 40
Antigüedad: 10 años, 8 meses
Puntos: 1
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

Espero te sirva para sacar los cumpleaños de los proximos 10 dias:

SELECT * FROM tabla WHERE day(campo) <= day(DATE_ADD(CURDATE(),INTERVAL 10 DAY))

Salu2!!
  #7 (permalink)  
Antiguo 15/04/2014, 04:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

Cita:
implemente tu ayuda pero no me funciono :(
Que error te da?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 15/04/2014, 04:25
Avatar de 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?

Yo prompongo:
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.     personal
  10.     TIMESTAMPDIFF(YEAR, fecha_nacimiento, CURDATE()) < TIMESTAMPDIFF(YEAR, fecha_nacimiento, ADDDATE(CURDATE(), 10))
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 15/04/2014, 06:31
 
Fecha de Ingreso: marzo-2007
Mensajes: 17
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

muchas gracias gnzsoloyo:
si me funciono con tu ayuda.

dejo el codigo para todos para compartir con la comunidad

Código MySQL:
Ver original
  1.     personal.id_personal,
  2.     personal.nombres,
  3.     personal.apellido_paterno,
  4.     personal.apellido_materno,
  5.     personal.estado_civil,
  6.     personal.fecha_nacimiento,
  7.     personal.genero,
  8.     personal.tipo_administrativo
  9.     personal
  10.  DATE_FORMAT(fecha_nacimiento,'%m %d') = DATE_FORMAT(CURDATE(),'%m %d') or
  11. TIMESTAMPDIFF(YEAR, fecha_nacimiento, CURDATE()) < TIMESTAMPDIFF(YEAR, fecha_nacimiento, ADDDATE(CURDATE(), 10))
  12.         personal.fecha_nacimiento,'%m %d'
  13.     )
  #10 (permalink)  
Antiguo 15/04/2014, 07:37
Avatar de 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)
  #11 (permalink)  
Antiguo 15/04/2014, 09:07
 
Fecha de Ingreso: marzo-2007
Mensajes: 17
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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.
MUCHAS GRACIAS por las recomendacion y la forma de optimizaciones que me indicas

pero cuando me sale este error:
Código MySQL:
Ver original
  1. [SQL]SELECT
  2.     id_personal,
  3.     nombres,
  4.     apellido_paterno,
  5.     apellido_materno,
  6.     estado_civil,
  7.     fecha_nacimiento,
  8.     genero,
  9.     tipo_administrativo
  10. FROM personal
  11.     MAKEDATE(YEAR(CURDATE(), DAYOFYEAR(fecha_nacimiento))) BETWEEN CURDATE() AND  ADDDATE(CURDATE(), 10)
  12.     AND TIMESTAMPDIFF(YEAR, fecha_nacimiento, CURDATE()) < TIMESTAMPDIFF(YEAR, fecha_nacimiento, ADDDATE(CURDATE(), 10))
  13. ORDER BY MONTH(fecha_nacimiento), DAY(fecha_nacimiento)
  14.  
  15. [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' DAYOFYEAR(fecha_nacimiento))) BETWEEN CURDATE() AND  ADDDATE(CURDATE(), 10)
  16.  ' at line 12
  #12 (permalink)  
Antiguo 15/04/2014, 09:16
Avatar de 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?

Creo que había un paréntesis mal puesto.
Prueba así:
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)
Nota: Te recomiendo que instales el MySQL Workbench y hagas todas las pruebas relacionadas con MySQL en esa herramienta, ya que tiene un corrector sintáctico que te ayudará a resolver este tipo de cosas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 15/04/2014 a las 09:27
  #13 (permalink)  
Antiguo 15/04/2014, 09:48
 
Fecha de Ingreso: marzo-2007
Mensajes: 17
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Consulta mysql para calcular los cumpleañeros de la semana?

nuevamente gracias: gnzsoloyo por las recomendacion.

me anda perfecto la consulta pero
el resultado no me muestra los cumpleañeros del dia actual solo de los proximos 10 dias
  #14 (permalink)  
Antiguo 15/04/2014, 10:08
Avatar de 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?

Pues probemos otra forma:
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 MAKEDATE(YEAR(CURDATE()), DAYOFYEAR(fecha_nacimiento)) BETWEEN  CURDATE() AND ADDDATE(CURDATE(), 10)
  12. ORDER BY MONTH(fecha_nacimiento), DAY(fecha_nacimiento)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: calcular, campo, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:09.