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

lista de cumpleaños con ultimo arriba

Estas en el tema de lista de cumpleaños con ultimo arriba en el foro de Bases de Datos General en Foros del Web. Hola, me piden una lista de cumpleaños anual con el ultimo arriba (hoy) y el de ayer al final , ahora bien, es eso posible ...
  #1 (permalink)  
Antiguo 26/04/2011, 09:45
 
Fecha de Ingreso: diciembre-2002
Mensajes: 473
Antigüedad: 21 años, 4 meses
Puntos: 0
lista de cumpleaños con ultimo arriba

Hola, me piden una lista de cumpleaños anual con el ultimo arriba (hoy) y el de ayer al final , ahora bien, es eso posible con una sentencia sql? pueden darme alguna idea o ejemplo para poder ver de adaptarlo a esto que me pedian? yo estuve varias horas desde ayer pero aun no doy en la tecla
saludos !!
  #2 (permalink)  
Antiguo 26/04/2011, 10:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: lista de cumpleaños con ultimo arriba

No entendí como que te piden todo el año y el dia de hoy arriba y el de ayer abajo ¿y los demás dónde?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 26/04/2011, 10:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Tema movido desde PHP a Bases de Datos General
  #4 (permalink)  
Antiguo 26/04/2011, 10:11
 
Fecha de Ingreso: diciembre-2002
Mensajes: 473
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: lista de cumpleaños con ultimo arriba

hola, gracias abimaelrc. Si, seria algo asi:

hoy es 26 de abril

la lista es:

cumple años:

hoy 26 de abril...........juan <---- primer registro
mañana 27 de abril.... pedro
28 de abril.....jose
6 junio....miguel
8 setiembre....francisco
1 enero....luis
3 marzo... antonio
25 abril .... cristian <------------------------ayer queda como ultimo registro


no se si se entiende, creo que facebook lo ordena igual.

saludos!
  #5 (permalink)  
Antiguo 26/04/2011, 11:29
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: lista de cumpleaños con ultimo arriba

Hola tico74:

Comencemos desde el principio, si es posible obtener un ordenamiento como el que mencionas, pero hay algunas cosas que tienes que aclarar.

Primero, en tu post no mencionas qué manejador de BD estás utilizando. Como te movieron desde PHP podría suponer que estás trabajando con MySQL, pero eso sólo tu lo sabes.

Segundo, deberías decirnos cómo almacenas la fecha de cumpleaños en tu tabla. Podría suponer que almacenas la fecha de nacimiento de las personas, pero en qué tipo de dato, date, datetime, varchar, etc.

Tercero, dices que llevas varias horas buscando alguna solución, pero no nos pones nada del código que intentaste hacer, ojo con eso.

La manera en que solucioné este problema es la siguiente.

Supongamos que en tu tabla tienes los siguientes datos:

Código MySQL:
Ver original
  1. mysql> select * from tabla order by nombre;
  2. +-----------+------------+
  3. | nombre    | fecha_nac  |
  4. +-----------+------------+
  5. | antonio   | 1975-03-03 |
  6. | cristian  | 1959-04-25 |
  7. | francisco | 1981-09-08 |
  8. | jose      | 1982-04-28 |
  9. | juan      | 1980-04-26 |
  10. | luis      | 1945-01-01 |
  11. | miguel    | 1978-06-06 |
  12. | pedro     | 1981-04-27 |
  13. +-----------+------------+
  14. 8 rows in set (0.06 sec)

Como podrás suponer fecha_nac almacena la fecha de nacimiento de la persona como un campo DATE. Ahora bien, lo que tengo que hacer es obtener la fecha se su próximo cumpleaños, para este caso NO NOS INTERESA EL AÑO DE NACIMIENTO, SOLO EL MES Y EL DÍA.

Si sustituimos el año de nacimiento por el actual entonces tendríamos algo como esto:

Código MySQL:
Ver original
  1. +-----------+------------+
  2. | nombre    | fecha_cump |
  3. +-----------+------------+
  4. | antonio   | 2011-03-03 |
  5. | cristian  | 2011-04-25 |
  6. | francisco | 2011-09-08 |
  7. | jose      | 2011-04-28 |
  8. | juan      | 2011-04-26 |
  9. | luis      | 2011-01-01 |
  10. | miguel    | 2011-06-06 |
  11. | pedro     | 2011-04-27 |
  12. +-----------+------------+

Ahora bien, Luis, Antonio y Cristian ya cumplieron años en el 2011, por lo que su siguiente cumpleaños es hasta el 2012, por lo tanto con una sentencia IF o CASE, podrías preguntar si la fecha_cump es < que la fecha actual entonces en lugar de agregar 2011, agregar un 2012. Si ordenas por esta nueva fecha_cump te quedaría algo como esto:

Código MySQL:
Ver original
  1. +-----------+------------+
  2. | nombre    | fecha_cump |
  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. +-----------+------------+

Si observas la persona que cumpe años hoy aparece en primer lugar, y la persona que cumplió años ayer aparece hasta la última posición. Me gustaría que tú mismo intentaras hacer la consulta, si tienes problemas coméntanos que haz intentado hacer, para ayudarte a afinar la consulta en la que estés trabajando.

Saludos
Leo
  #6 (permalink)  
Antiguo 26/04/2011, 12:14
 
Fecha de Ingreso: diciembre-2002
Mensajes: 473
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: lista de cumpleaños con ultimo arriba

Gracias Leonardo y perdon esos detalles
Con respecto a las consultas:
1) Si, el manejador de BD seria mysql.
2) Si, es de tipo date
3) Esencialmente probe un monton de veces con codigo sql y funciones sobre el ORDER ya que con php se me haria mas complicado por el tipo de aplicacion que es y me parecia podria ir por ese lado.
Lo ultimo que pude lograr es ordenar por año pero no pase de ahi , ahora esy quedo:

SELECT

campos

FROM
usuarios

WHERE usuario.status = 4

group by usuario.uid

order by MONTH(birthday), DAYOFMONTH(birthday)


Mi ultimo intento era ver algun tipo de manejo con ordenamiento con
DAYOFYEAR, pero no logre nada, ahora estaba viendo con IF, como me comentaste pero aun no logre encontrar ejemplos de referencia de IF dentro de ORDER.

Creo que con eso podria experimentar un poco mejor.
Gracias de nuevo por tu tiempo y ayuda!
  #7 (permalink)  
Antiguo 26/04/2011, 13:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.
  #8 (permalink)  
Antiguo 26/04/2011, 14:02
 
Fecha de Ingreso: diciembre-2002
Mensajes: 473
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: lista de cumpleaños con ultimo arriba

Leonardo, mil gracias, impresionante el trabajo que te tomaste y estoy seguro que sera de mucha utilidad, yo por lo pronto me imprimire todo el posteo.
Justo estaba probando de otra forma y parecia andar, pero me gustaria tu que eres experto a ver que te parece o si le ves alguna falla:

"SELECT
DAYOFYEAR(cumple) AS numerocumple,
dayofyear(NOW()) AS numerohoy,
CONCAT(IF(dayofyear(NOW()) <= DAYOFYEAR(cumple),'2011',"2012"),'-',Month(cumple),'-',DAY(cumple)) as nextBirthday
FROM
tablas
WHERE
status = 4
group by id
order by nextBirthday ASC, MONTH(cumple), DAYOFMONTH(cumple)"

quias en vez de 2011 y 2012 use year +1 o algo asi, quizas seria mejor, verdad?

Un abrazo grande, gracias por estar ahi, amigo.
  #9 (permalink)  
Antiguo 26/04/2011, 14:56
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: lista de cumpleaños con ultimo arriba

Hola de nuevo tico74:

Me alegra que hayas encontrado una solución por tu cuenta, no veo nada que pudiera afectar la consulta, parece que es correcta , sólo el detalle que mencionas de poner 2011 y 2012 fijos no te lo recomiendo, pues la consulta sería válida sólo para este año, tal como supones correctamente podrías sustituirla por

Código MySQL:
Ver original
  1. YEAR(now()), YEAR(now())+1)
  2.  
  3. o
  4.  

También tienes que tomar en cuenta que el campo nextBirthday lo estarías regresando como una cadena, no como date, (en mi ejemplo es por eso que al final hago un STR_TO_DATE())

Finalmente en la cláusula ORDER BY no le veo sentido a que coloques MONTH(cumple), DAYOFMONTH(cumple), creo que bastaría con poner simplemente esto:

Código MySQL:
Ver original
  1. Order by nextBirthday

La cláusula ASC también estaría de más, ya que es el valor que toma por defecto.

Como te habrás dado cuenta, MySQL te permite muchas formas de llegar a un mismo resultado, existen muchas funciones sinónimas, como el IF y el CASE-WHEN o para el caso del manejo de fechas


Todas te regresarían "2011", así es que elige la que más te agrade.

Saludos
Leo.
  #10 (permalink)  
Antiguo 26/04/2011, 15:00
 
Fecha de Ingreso: diciembre-2002
Mensajes: 473
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: lista de cumpleaños con ultimo arriba

Impecable, Leo, realmente no se si eres moderador aqui pero lo que sabes y el gusto que tienes por mejorar cada codigo es admirable y recomendable. Muchas gracias pro tu ayuda y copiare , tomare nota e imprimire esto ultimo que me decias, mil gracias!!
  #11 (permalink)  
Antiguo 27/04/2011, 08:10
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: lista de cumpleaños con ultimo arriba

Gracias tico74, no tengo el estatus de colaborador en el foro, pero me gusta tratar de ayudar... me alegra mucho que los comentarios que te hice te sirvieran en algo.

Saludo
Leo.
  #12 (permalink)  
Antiguo 27/04/2011, 08:44
 
Fecha de Ingreso: diciembre-2002
Mensajes: 473
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: lista de cumpleaños con ultimo arriba

Mucho mas meritorio aun entonces!. Los lideres y moderadores del sitio debieran tomar nota de gente como tu, que ayuda y da su tiempo en forma totalmente desinteresada y noble. Me parece que generan el movimiento y que uno vuelva, y me parece incluso no estaria de mas pensar en alguna retribucion monetaria ya que le dan vida a la web.
Gracias de nuevo y espero poder seguir el contacto!

Etiquetas: arriba, cumpleaños, lista, php, ultimo
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 23:28.