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

Cumpleaños en mysql

Estas en el tema de Cumpleaños en mysql en el foro de Mysql en Foros del Web. Holas tengo un problema al generar una consulta en MYSQL, espero que alguien me pueda ayudar... Lo que quiero conseguir es una consulta que compare ...
  #1 (permalink)  
Antiguo 08/07/2010, 14:24
 
Fecha de Ingreso: mayo-2010
Mensajes: 22
Antigüedad: 14 años
Puntos: 0
Cumpleaños en mysql

Holas tengo un problema al generar una consulta en MYSQL, espero que alguien me pueda ayudar...

Lo que quiero conseguir es una consulta que compare la fecha actual con una fecha guardad en la base de datos y me de como resultado una lista formada por los dias que faltan para llegar a la fecha guardada.
Vale decir que la fecha guardada en la base de datos (fNacimiento) es varchar(10) y no hay valores nulos.
Tengo los siguientes codigos que he estado probando:

select datediff(date_format(curdate(),'%d/%m/%Y'), str_to_date(fNacimiento,'%d/%m/%Y') from persona;

select datediff(date_format(curdate(),'%d/%m/%Y'), str_to_date(replace(fNacimiento, substring(fNacimiento,7), '2010')),'%d/%m/%Y') x from persona;
'esto es lo mismo solo cambie el año a 2010 para cada valor y asi realizar la consulta

select codigo from persona
where datediff(date_format(curdate(),'%d/%m/%Y'), str_to_date(fNacimiento,'%d/%m/%Y') >0;

select codigo from persona
where datediff(date_format(curdate(), '%d/%m/%Y'), date_format(fNacimiento, '%d/%m/%Y')) >0;

En fin algunas variaciones de estos mismos codigos, osea mas de lo mismo y siempre me sale error. Alguien que me pueda ayudar porfavor estare muy agradecido.

Última edición por belzebux; 08/07/2010 a las 14:32
  #2 (permalink)  
Antiguo 09/07/2010, 01:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Cumpleaños en mysql

Prueba esta:
SELECT DATEDIFF(CURDATE(), STR_TO_DATE(fNacimiento,'%d/%m/%Y') diashastacumple FROM persona;
  #3 (permalink)  
Antiguo 09/07/2010, 07:29
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: Cumpleaños en mysql

Técnicamente, lo que intentas hacer está bien orientado. La propuesta de Jurena es perfectamente funcional, pero para estar seguros habría que saber con certeza qué formato tienen esas fechas.
Me explico: El problema básico con STR_TO_DATE() es que si alguna fecha está mal escrita, o tiene alguna diferencia respecto a lo esperado, entonces dará NULL. Y uno de los problemas de usar VARCHAR para las fechas es precisamente que debes validar mucho las entradas para que no pongan basura.

Esto funciona bien:
Código MySQL:
Ver original
  1. mysql> SELECT STR_TO_DATE('20/10/2010', '%d/%m/%Y') FECHA;
  2. +------------+
  3. | FECHA      |
  4. +------------+
  5. | 2010-10-20 |
  6. +------------+
  7. 1 row in set (0.00 sec)
Si no se respeta el orden dd/mm/aaaa, anda mal:
Código MySQL:
Ver original
  1. mysql> SELECT STR_TO_DATE('20/10/2010', '%m/%d/%Y') FECHA;
  2. +-------+
  3. | FECHA |
  4. +-------+
  5. | NULL  |
  6. +-------+
  7. 1 row in set, 1 warning (0.00 sec)

Y si uno o ambos separadores no son lo s correctos, tampoco funciona:
Código MySQL:
Ver original
  1. mysql> SELECT STR_TO_DATE('20/10/2010', '%d-%m-%Y') FECHA;
  2. +-------+
  3. | FECHA |
  4. +-------+
  5. | NULL  |
  6. +-------+
  7. 1 row in set, 1 warning (0.00 sec)
  8.  
  9. mysql> SELECT STR_TO_DATE('20/10/2010', '%d-%m/Y') FECHA;
  10. +-------+
  11. | FECHA |
  12. +-------+
  13. | NULL  |
  14. +-------+
  15. 1 row in set, 1 warning (0.00 sec)

Como verás, es una función algo exigente...

Tus pruebas:
Código MySQL:
Ver original
  1. SELECT DATEDIFF(DATE_FORMAT(curdate(),'%d/%m/%Y'), STR_TO_DATE(fNacimiento,'%d/%m/%Y')
  2. FROM persona;
Está mal, porque en la primera parte estás convirtiendo la fecha actual en una cadena con el formato "dd/mm/aaa" y en la segunda creando un DATE de una cadena "dd/mm/aaa". O sea estás tranformando una pera e una manzana y una manzana en una pera...
¿Para qué haces la primera conversión? Con esto alcanzaba:
Código MySQL:
Ver original
  1. SELECT DATEDIFF(curdate(), STR_TO_DATE(fNacimiento,'%d/%m/%Y')
  2. FROM persona;
En todos los restantes casos hiciste lo mismo...

Tips:
1. Prueba con lo que te está diciendo Jurena.
2. Verifica si puedes modificar la tabla y usar un DATE o DATETIME en lugar de usar un tipo de columna totalmente incorrecto y problemático como VARCHAR para guardar fechas. Ahorrarás espacio en disco y tendrás menos problemas en las consultas basadas en tiempo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 09/07/2010, 08:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Cumpleaños en mysql

Estoy completamente de acuerdo con gnzsoloyo. Mi primer consejo es ver la posibilidad de cambiar los datos de ese campo varchar a otro campo date o datetime. Luego te evitarías todos estos problemas, pero antes debes ver el modo en que tienes programada la carga de datos en la base. El cliente deberá poder seguir escribendo la fecha como hasta ahora, pero tú, mediante programación deberás cambiar el formato a año-mes-día antes de cargarlo en la base. No sé cómo recibes el dato, si desde un calendario, un selector o cómo. Cuando veas que puedes hacerlo podremos ayudarte a crear ese otro campo y trasladar los datos desde el viejo campo varchar.
  #5 (permalink)  
Antiguo 09/07/2010, 10:50
 
Fecha de Ingreso: mayo-2010
Mensajes: 22
Antigüedad: 14 años
Puntos: 0
Respuesta: Cumpleaños en mysql

Mil gracias jurena y gnzsoloyo de verdad, probe con el codigo tal cual esta en ambos casos

SELECT DATEDIFF(DATE_FORMAT(CURDATE(),'%d/%m/%Y'), STR_TO_DATE(fNacimiento,'%d/%m/%Y') FROM persona;

SELECT DATEDIFF(CURDATE(), STR_TO_DATE(fNacimiento,'%d/%m/%Y') diashastacumple FROM persona;

sin embargo ambos me dieron el error : 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 'FROM persona' at line 1

Vale decir que los datos ingresados en la base de datos estan todos correctos pues les hice la validacion en el vs.net e ingresan a las tablas asi x ejm. "09/07/2010"

La buena noticia es que ya solucione mi problema jeje. Este es el codigo que utilice y me va de maravilla, espero que a alguien le ayude tambien ;)

select codigo, year(now())-year(str_to_date(fNacimiento, '%d/%m/%Y')) edad , dayofyear(str_to_date(replace(fNacimiento, substring(fNacimiento,7), year(now())),'%d/%m/%Y')) - dayofyear(now()) diashastacumple,
str_to_date(replace(fNacimiento, substring(fNacimiento,7), year(now())),'%d/%m/%Y') diadecumple
from persona
where dayofyear(str_to_date(fNacimiento, '%d/%m/%Y')) >= dayofyear(now())
order by diashastacumple;

claro que es mas de lo que queria inicialmente jeje.
Saludos y nuevamente mil gracias ;)

Última edición por belzebux; 09/07/2010 a las 10:56
  #6 (permalink)  
Antiguo 09/07/2010, 12:52
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: Cumpleaños en mysql

Deberías tratar de no quedarte simplemente con que había un error en las sentencias que probaste.
De la primera ya te dije: Está mal escrita porque es ilógica.
La segunda es más sencillo y te hubieses dado cuenta de solo ponerte a revisar la sintaxis: No cerraste el paréntesis de DATEDIFF()...
Suponiendo que la fecha contenido en fNacimiento fuese "09/07/2009", la consulta sería:
Código MySQL:
Ver original
  1. SELECT DATEDIFF(CURDATE(), STR_TO_DATE('19/07/2010','%d/%m/%Y')) diashastacumple
  2. FROM persona;
  3. +-----------------+
  4. | diashastacumple |
  5. +-----------------+
  6. |             10 |
  7. +-----------------+
  8. 1 row in set (0.00 sec)

Así pues, la consulta esta bien escrita...
Cita:
Vale decir que los datos ingresados en la base de datos estan todos correctos pues les hice la validacion en el vs.net e ingresan a las tablas asi x ejm. "09/07/2010"
No te quedes con eso simplemente. Procura poner el campo como DATE, que es lo que corresponde. Si lo que quieres luego es que las consultas te devuelvan la fecha en formato español, simplemente usas DATE_FORMAT(), eso es lo que se debe hacer...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 09/07/2010, 13:44
 
Fecha de Ingreso: mayo-2010
Mensajes: 22
Antigüedad: 14 años
Puntos: 0
Respuesta: Cumpleaños en mysql

Ok gnzsoloyo tenias razon me falto cerrar el parentesis jeje, bueno tratare de modificar la fecha a tipo DATE.
De cualquier forma mil gracias.

Etiquetas: cumpleaños
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 04:55.