Ver Mensaje Individual
  #11 (permalink)  
Antiguo 01/02/2010, 14:26
Avatar de gnzsoloyo
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: Problema DATE en visita últimos 30 días

Veamos:
Código MySQL:
Ver original
  1. SELECT COUNT(id) Visitas
  2. FROM usuarios
  3. WHERE STR_TO_DATE(extra_info,'%d-%m-%Y %T')
  4.  BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND CURDATE() != extra_info;
no tiene mucho sentido porque el BETWEEN tiene dos parámetros nada más:
Código MySQL:
Ver original
  1. valorComparado BETWEEN valorMinimo AND valorMaximo
Entonces, != extra_info no forma parte de la sentencia.
Aquí lo que deberías hacer es poner las funciones correctas y no comparar valores incompatibles.
Me explico: Por un lado, para que la comparación sea válida, los tipos de datos deben ser iguales, y sabemos que extra_info contiene un dato mal escrito (un DATETIME no se debe jamás guardar de esa forma), por lo que para que el BETWEEN haga lo que debe, extra_info debe ser previamente convertido en un DATETIME. Caso contrario, los resultados serán erráticos.
En segundo lugar, hubo si, un desliz: CURDATE() devuelve un DATE, no un DATETIME, y eso es fundamental a la hora de comparar fechas.
MySQL, a partir de la versión 5.0 convierte los datos de fecha (DATE) en su formato superior (DATETIME) cuando la comparación u operación contiene ambos. Esto significa que un resultado '2010-02-01', se convierte en '2010-02-01 00:00:00', si se compara contra un datetime. Como es obvio, esa conversión es inferior a una visita realizada a las '2010-02-01 00:00:01' y posteriores, que es lo que sucederá con la consulta tal como la planteamos originalmente. Por eso, cualquier visita realizada con posterioridad a la hora cero, no aparecerá en la tabla.
¿Cómo resolver el problema?
Simple: Cambiando CURDATE() por NOW()...
Código MySQL:
Ver original
  1. SELECT COUNT(id) Visitas
  2. FROM usuarios
  3.        (STR_TO_DATE(extra_info,'%d-%m-%Y %T')  BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND NOW());
¿Por qué cambio sólo uno y no los dos CURDATE()? , porque el problema está en el límite superior y no en el inferior, ya que la conversión del primero pondrá, como te dije, las "00:00:00", con lo que abarcará todo el día.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)