Ver Mensaje Individual
  #7 (permalink)  
Antiguo 26/04/2011, 13:34
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: lista de cumpleaños con ultimo arriba

Hola de nuevo tico74:

El truco no está en el order by, sino en obtener la fecha del siguiente cumpleaños, de tal manera que la ordenación quedaría simplemente como

Código MySQL:
Ver original
  1. ORDER by fecha_siguiente_cumple.

Creo que no seguiste el curso del ejemplo que te puse en mi post. checa este código

Código MySQL:
Ver original
  1. mysql> create table  tabla (nombre varchar(50), fecha_nac date);
  2. Query OK, 0 rows affected (0.44 sec)
  3.  
  4. mysql> insert into tabla values ('antonio', '1975-03-03'),('cristian', '1959-04-25'),
  5.     -> ('francisco', '1981-09-08'), ('jose', '1982-04-28'), ('juan', '1980-04-26'),
  6.     -> ('luis', '1945-01-01'), ('miguel', '1978-06-06'), ('pedro', '1981-04-27');
  7. Query OK, 8 rows affected (0.19 sec)
  8. Records: 8  Duplicates: 0  Warnings: 0
  9.  
  10. mysql> select * from tabla;
  11. +-----------+------------+
  12. | nombre    | fecha_nac  |
  13. +-----------+------------+
  14. | antonio   | 1975-03-03 |
  15. | cristian  | 1959-04-25 |
  16. | francisco | 1981-09-08 |
  17. | jose      | 1982-04-28 |
  18. | juan      | 1980-04-26 |
  19. | luis      | 1945-01-01 |
  20. | miguel    | 1978-06-06 |
  21. | pedro     | 1981-04-27 |
  22. +-----------+------------+
  23. 8 rows in set (0.05 sec)
  24.  
  25. mysql> select nombre,
  26. %m'), date_format(fecha_nac, '%d')), '%Y%m%d') fecha_siguiente_cumple
  27.     -> from tabla
  28.     -> order by fecha_siguiente_cumple;
  29. +-----------+------------------------+
  30. | nombre    | fecha_siguiente_cumple |
  31. +-----------+------------------------+
  32. | luis      | 2011-01-01             |
  33. | antonio   | 2011-03-03             |
  34. | cristian  | 2011-04-25             |
  35. | juan      | 2011-04-26             |
  36. | pedro     | 2011-04-27             |
  37. | jose      | 2011-04-28             |
  38. | miguel    | 2011-06-06             |
  39. | francisco | 2011-09-08             |
  40. +-----------+------------------------+
  41. 8 rows in set (0.00 sec)

Con esto obtendrías la primer parte de mi explicación, es decir, tomas sólo el mes y el día y le concatenas el año actual. Ahora lo que faltaría hacer en el select es algo como esto:

Código MySQL:
Ver original
  1. select nombre, case when
  2. (
  3. str_to_date(concat(extract(year from curdate()), date_format(fecha_nac, '%m'), date_format(fecha_nac, '%d')), '%Y%m%d') >= curdate()
  4. )
  5.    #Todavía no cumple años, por lo tanto seleccionas la misma fecha que calculaste
  6.    str_to_date(concat(extract(year from curdate()), date_format(fecha_nac, '%m'), date_format(fecha_nac, '%d')), '%Y%m%d')
  7.    #ya cumplió años, por lo tanto en lugar de concatenar
  8.    #extract(year from curdate()) concatenas extract(year from curdate()) + 1
  9.    str_to_date(concat(extract(year from curdate()) + 1, date_format(fecha_nac, '%m'), date_format(fecha_nac, '%d')), '%Y%m%d')
  10.  fecha_siguiente_cumple
  11. from tabla
  12. order by fecha_siguiente_cumple

esta consulta te estaría regresando lo siguiente:

Código MySQL:
Ver original
  1. +-----------+------------------------+
  2. | nombre    | fecha_siguiente_cumple |
  3. +-----------+------------------------+
  4. | juan      | 2011-04-26             |
  5. | pedro     | 2011-04-27             |
  6. | jose      | 2011-04-28             |
  7. | miguel    | 2011-06-06             |
  8. | francisco | 2011-09-08             |
  9. | luis      | 2012-01-01             |
  10. | antonio   | 2012-03-03             |
  11. | cristian  | 2012-04-25             |
  12. +-----------+------------------------+
  13. 8 rows in set (0.02 sec)

Lo único que faltaría es presentar la fecha en el formato que prefieras (26 de abril). Dale un vistazo a la consulta, y si tienes problemas lo comentas.

Saludos
Leo.