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

Problema DATE en visita últimos 30 días

Estas en el tema de Problema DATE en visita últimos 30 días en el foro de Mysql en Foros del Web. Hola a todos... Resulta que quiero mostrar la cantidad de visitas de los últimos 30 días. Para esto tengo el campo "extra_info" con este formato ...
  #1 (permalink)  
Antiguo 31/01/2010, 17:31
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Problema DATE en visita últimos 30 días

Hola a todos...

Resulta que quiero mostrar la cantidad de visitas de los últimos 30 días. Para esto tengo el campo "extra_info" con este formato de fecha: "18-01-2010 10:56:43" que se va registrando en la BD cada vez que el usuario ingresa. Ahora bien, después de leer el manual, la manera de hacerlo sería esta:

$query = "SELECT COUNT(id) AS Visitas FROM usuarios WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= extra_info";

Pero resulta que no me imprime nada por que el formato de fecha no está en el estándar de MySQL, es decir: "0000-00-00" "YYYY-mm-dd.

No logro o no comprendo, como hacer para que me lea el formato de fecha "dd-mm-YYYY" para que me imprima los resultados.

Por favor, alguien me puede dar una mano u orientarme?
  #2 (permalink)  
Antiguo 31/01/2010, 17:57
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Problema DATE en visita últimos 30 días

Yo te aconsejo que tengas un campo donde guardes el valor time(), que es digamos la fecha en cantidad de segundos, con esa cifra el mostrar registros de las ultimas horas, ultimos dias es muy muy sencillo
  #3 (permalink)  
Antiguo 31/01/2010, 18:07
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Problema DATE en visita últimos 30 días

Gracias Vun...

Osea que teniendo este campo "extra_info" con ese formato de fecha no tengo solución... no puedo hacer que me muestre la consulta???
  #4 (permalink)  
Antiguo 31/01/2010, 18:19
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Problema DATE en visita últimos 30 días

Si con mysql seguro que tambien se puede, te dejo una busqueda en este foro: http://www.forosdelweb.com/f18/uso-f...2/#post1102564
  #5 (permalink)  
Antiguo 31/01/2010, 19:19
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Problema DATE en visita últimos 30 días

Gracias Vun, pero con el post que me dijiste no me puedo aclarar...

Leyendo por otros lados, estoy intentándolo de esta manera:

$query = "SELECT COUNT(id) AS Visitas FROM usuarios WHERE DATE_SUB(STR_TO_DATE(extra_info,'%d-%m-%Y %T') = CURDATE(),INTERVAL 30 DAY) <= extra_info";

Pero la consulta me da "0", no se si estoy bien orientado o que estoy haciendo mal...!!!
  #6 (permalink)  
Antiguo 31/01/2010, 21:02
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: Problema DATE en visita últimos 30 días

No compliques las cosas más de lo necesario.
Con tu consulta lo que estabas pidiendo era que contara aquellos registros en los que la fecha en "extra_info" menos 30 días fuese igual o menos al valor de "extra_info"... O sea, algo que no tenía sentido.
Lo que necesitas es en realidad contar las visitas en que la fecha de "extra_info" esté entre los últimos 30 días.
Esto se puede lograr de dos formas. Una, restando el valor de "extra_info" a la fecha actual:
Código SQL:
Ver original
  1. SELECT COUNT(id) Visitas
  2. FROM usuarios
  3. WHERE TIMESTAMPDIFF(DAY, STR_TO_DATE(extra_info,'%d-%m-%Y %T'),CURDATE()) <= 30;
Y la otra (más estándar) es contar las que se encuentren entre 30 días atrás y hoy:
Código SQL:
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();
__________________
¿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 31/01/2010, 21:26
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Problema DATE en visita últimos 30 días

Muchísimas gracias gnzsoloyo...

Sí, así funciona y es más fácil... pero esta manera de hacerlo no lo encontré o se me pasó por alto en los lugares donde leí

Nuevamente muchas gracias, lo mismo de siempre, todos los días se aprende algo más gracias a la buena predisposición de la gente del Foro

Saludos!
  #8 (permalink)  
Antiguo 31/01/2010, 21:43
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Problema DATE en visita últimos 30 días

A mi tambien me sirvio bastante a conocer esas funciones de Mysql, thanks gnzsoloyo

+karma
  #9 (permalink)  
Antiguo 01/02/2010, 06:48
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: Problema DATE en visita últimos 30 días

Por nada.
Me alegro que les sirvieran.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 01/02/2010, 11:38
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Problema DATE en visita últimos 30 días

Hola, retomo el tema nuevamente por consulta con resultado extraño...

Con la consulta más estándar que buenamente da gnzsoloyo:

Código SQL:
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();

Resulta que un usuario que ya tenía su "extra_info" en el rango de los 30 días y entra nuevamente en el día de hoy; en el resultado total en vez de dejarlo tal cuál, lo va restando.. cosa extraña.

Ahora bien, si a la consulta le agregamos:

Código SQL:
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;

Ahí sí lo deja como está o si es un usuario nuevo en la visita, lo suma al resultado total, no se si es coincidencia o algo falta!
  #11 (permalink)  
Antiguo 01/02/2010, 14:26
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: 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)
  #12 (permalink)  
Antiguo 01/02/2010, 15:25
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Problema DATE en visita últimos 30 días

Excelente gnzsoloyo ...!

Sobre todo por la explicación, muchas gracias por la enseñanza!!!
  #13 (permalink)  
Antiguo 08/10/2010, 08:43
 
Fecha de Ingreso: enero-2006
Mensajes: 199
Antigüedad: 18 años, 3 meses
Puntos: 5
Respuesta: Problema DATE en visita últimos 30 días

Código SQL:
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();

Como puedo modificando este codigo selecionar rangos de años por ejemplo de 1992 a 2008.
  #14 (permalink)  
Antiguo 08/10/2010, 10:03
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: Problema DATE en visita últimos 30 días

Eso ya lo preguntaste y te lo respondieron en otro post: http://www.forosdelweb.com/f86/selec...o-anos-849010/
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: date
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:46.