MySQL - Problemas manejo de fecha y condición

 
Vista:

Problemas manejo de fecha y condición

Publicado por Alfonso López Tovar (1 intervención) el 25/01/2012 01:14:59
Buenas tardes para todos los expertos de mysql, solicito su ayuda en lo siguiente:

1. Estoy realizando esta consulta a la tabla evento, en donde necesito que me filtre aquellos eventos que su fecha de expiración sea mayor igual a la fecha actual:

SELECT titulo, comentario, fecha_pub, fecha_exp FROM evento WHERE estado =1
AND ( SELECT fecha_exp >= DATE_FORMAT( CURRENT_DATE( ) , '%d-%m-%Y' ) )
ORDER BY id DESC LIMIT 0 , 30

Sin embargo en el momento de ejecutar la consulta no me muestra algunos eventos que cumplen con la condición, me gustaría saber si existe otra forma de hacer lo que requiero.

Agradezco su valioso aporte.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problemas manejo de fecha y condición

Publicado por Gonzalo GC (339 intervenciones) el 25/01/2012 11:21:40
El primer error es que has hecho la estupidez de poner una fecha en un campo VARCHAR, o al menos eso se desprende de esto:
1
fecha_exp >= DATE_FORMAT( CURRENT_DATE( ) , '%d-%m-%Y' )

Una fecha se debe almacenar siempre como DATE, DATETIME o TIMESTAMP, pero no como VARCHAR. Cuando la pones como caracteres la comparación se hace por su valor en caracteres y no su valor real, lo que genera errores calamitosos en las consultas.
Esto es por algo tan simple como que el 31 de enero de 1890 es en realidad mayor que el 13 de diciembre de 2225, porque la comparación se hace así:
31/01/1890
13/12/2025
Si ordenas estos números de menor a mayor como caracteres, verás que el 1 aparece antes que el 3, y las fechas quedan:
13/12/2025
31/01/1890
¿Se entiende el problema?
Entonces la cosa es que para lograr que la consulta de resultado no sirve que pongas un rango como el que pones, porque en realidad MySQL no lo está entendiendo como fechas.
La mejor solución es que cambies el tipo de columna por el que corresponde. Pero eso en este momento te generará problemas ya que hay que migrar el dato,no cambiarlo, lo que no es lo mismo.
Por ello lo que puedes hacer es un "parche", y transformar el valor del campo a fecha para poder hacer la comparación:
1
2
3
4
5
6
SELECT
    titulo, comentario, fecha_pub, fecha_exp
FROM evento WHERE estado =1
    AND STR_TO_DATE(fecha_exp, '%d-%m-%Y' ) >= CURDATE()
ORDER BY id DESC
LIMIT 0 , 30

Por cierto: Hacer esto para obtener una comparación:

1
AND ( SELECT fecha_exp >= DATE_FORMAT( CURRENT_DATE( ) , '%d-%m-%Y' ) )

muestra un total desconocimiento de SQL. Por favor, estudia un poco de SQL antes de escribir las sentencias. Te ahorrarás serios problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar