Ver Mensaje Individual
  #6 (permalink)  
Antiguo 08/06/2011, 09:03
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: seleccionar cumpleaños

Hola compañeros:

La consulta del compañero gnzsoloyo serviría para obtener los que cumplen años el día de hoy faltaría obtener los posteriores. sólo habría que modificar faltaría colocar >= en la condición del dia (para obtener todos los que cumplen años el mes actual), y una condición OR con MES_NACIMIENTO > al actual para todos los que cumplan en meses posteriores.

El planteamiento del compañero Huesos52 también parece correcto, pero hay algunos problemas con el manejo de fechas que sería conveniente aclarar. hay que recordar que la función NOW regresa la fecha y hora actual, sin embargo en el límite superior que estás colocando pones esto:

Código MySQL:
Ver original
  1. mysql> select CAST(CONCAT(YEAR(NOW()),'-','12','-','31') AS DATETIME);
  2. +---------------------------------------------------------+
  3. | CAST(CONCAT(YEAR(NOW()),'-','12','-','31') AS DATETIME) |
  4. +---------------------------------------------------------+
  5. | 2011-12-31 00:00:00                                     |
  6. +---------------------------------------------------------+
  7. 1 row in set (0.00 sec)

Si observas la hora la pone como (00:00:00), por lo tanto si la consulta se ejecutara el 31 de diciembre después de las 00:00:00 horas, no mostraría los que cumplen años ese día.

Para evitar este tipo de problema sería recomendable manejar campos DATE, para acarrear la hora:

Código MySQL:
Ver original
  1. mysql> select CAST(CONCAT(YEAR(NOW()),'-','12','-','31') AS DATE);
  2. +-----------------------------------------------------+
  3. | CAST(CONCAT(YEAR(NOW()),'-','12','-','31') AS DATE) |
  4. +-----------------------------------------------------+
  5. | 2011-12-31                                          |
  6. +-----------------------------------------------------+
  7. 1 row in set (0.00 sec)

Modificando ambas soluciones quedaría más o menos así:

Código MySQL:
Ver original
  1. mysql> create table tabla (nombre varchar(15), fecha_nacimiento date);
  2. Query OK, 0 rows affected (0.13 sec)
  3.  
  4. mysql> INSERT INTO tabla VALUES ('Hugo', '1980-06-07'), ('Paco', '1973-06-08'),
  5.     -> ('Luis', '1967-12-31'), ('Leo', '1980-08-01');
  6. Query OK, 4 rows affected (0.03 sec)
  7. Records: 4  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> select * from tabla;
  10. +--------+------------------+
  11. | nombre | fecha_nacimiento |
  12. +--------+------------------+
  13. | Hugo   | 1980-06-07       |
  14. | Paco   | 1973-06-08       |
  15. | Luis   | 1967-12-31       |
  16. | Leo    | 1980-08-01       |
  17. +--------+------------------+
  18. 4 rows in set (0.00 sec)
  19.  
  20. mysql> #Con la solución que propone gnzsoloyo;
  21. mysql> SELECT *
  22.     -> FROM tabla
  23.     -> WHERE
  24.     -> DAY(fecha_nacimiento) >= DAY(CURDATE())
  25.     -> AND
  26.     -> MONTH(fecha_nacimiento) = MONTH(CURDATE())
  27.     -> OR
  28.     -> MONTH(fecha_nacimiento) > MONTH(CURDATE());
  29. +--------+------------------+
  30. | nombre | fecha_nacimiento |
  31. +--------+------------------+
  32. | Paco   | 1973-06-08       |
  33. | Luis   | 1967-12-31       |
  34. | Leo    | 1980-08-01       |
  35. +--------+------------------+
  36. 3 rows in set (0.00 sec)
  37.  
  38. mysql> #Con la solución que propone Huesos52;
  39. mysql> SELECT * FROM tabla
  40.     -> WHERE
  41.     -> CAST(
  42.     -> CONCAT(YEAR(NOW()),'-',MONTH(fecha_nacimiento),'-',DAY(fecha_nacimiento))
  43.  
  44.     -> AS DATE)
  45.     -> BETWEEN
  46.     -> CURDATE() AND
  47.     -> CAST(CONCAT(YEAR(NOW()),'-','12','-','31') AS DATE);
  48. +--------+------------------+
  49. | nombre | fecha_nacimiento |
  50. +--------+------------------+
  51. | Paco   | 1973-06-08       |
  52. | Luis   | 1967-12-31       |
  53. | Leo    | 1980-08-01       |
  54. +--------+------------------+
  55. 3 rows in set (0.00 sec)

Saludos
Leo.