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

Seleccionar registros que cumplan el rango de tiempo

Estas en el tema de Seleccionar registros que cumplan el rango de tiempo en el foro de Mysql en Foros del Web. Buenas, Estoy teniendo dificultades para poder seleccionar todos los registros que tengan el campo lastRefresh superior a 1 hora de diferencia con la hora actual. ...
  #1 (permalink)  
Antiguo 11/01/2011, 08:36
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Seleccionar registros que cumplan el rango de tiempo

Buenas,

Estoy teniendo dificultades para poder seleccionar todos los registros que tengan el campo lastRefresh superior a 1 hora de diferencia con la hora actual.

Es decir si en mi tabla tengo los siguientes datos

NULL
2011-01-11 13:00:00
2011-01-11 14:00:00
NULL
2011-01-11 15:00:00

Si ahora son las 2011-01-11 15:32:00

Me debería mostrar estas dos fechas, ya que su diferencia con la hora actual es superior a 1 hora y también los registros NULL.
2011-01-11 13:00:00
2011-01-11 14:00:00
NULL
NULL

No lo consigo, he estado haciendo pruebas con DATEDIFF y CURDATE() pero no acabo de sacarlo.

SELECT * FROM partidos WHERE DATEDIFF(CURDATE(),lastRefresh)>1 OR lastRefresh=NULL

Me podéis echar una mano? se puede hacer?

Muchas gracias
  #2 (permalink)  
Antiguo 11/01/2011, 09:15
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, 4 meses
Puntos: 2658
Respuesta: Seleccionar registros que cumplan el rango de tiempo

DATEDIFF() te devuelve el valor en diías entre dos fechas, por lo que no resulta adecuado para calcular una diferencia de minutos. En todo caso lo que te conviene es usar TIMEDIFF() o TIMESTAMPDIFF() contra CURTIME() o NOW() y no contra CURDATE().
La idea sería mas o menos así:
Código MySQL:
Ver original
  1. SELECT a, b, c
  2. FROM tabla
  3. WHERE TIMESTAMPDIFF(MINUTE, fecha_hora, NOW()) <=60;
o bien algo así:
Código MySQL:
Ver original
  1. SELECT TIMEDIFF(NOW(), '2011-01-10 13:59:59')<='01:00:00';
Solamente debes recordar que las funciones que usan DATETIMEs son sensibles a nivel de segundos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/01/2011, 09:41
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Seleccionar registros que cumplan el rango de tiempo

Buenos días Neodani:

Sólo tengo que agregar un detalle con respecto a lo que te comentó el compañero gnzsoloyo. La consulta que el te propone te arroja aquellos registros que tienen menos de una hora de diferencia con respecto a la hora actual y según lo que yo entendí lo que quieres es lo contrario, es decir, aquellos registros que tengan más de 1 hora de diferencia con respecto a la hora actual. Además de cambiar el signo <= 60 por > 60 deberás asegurarte que los registros correspondan a la misma fecha (pues sino cualquier registro con fecha anterior a la actual entra dentro de la categoría de más de una hora de no haber sido refrescado) y también faltaría agregar el caso de los campos null.

Creo, si entendí bien, que lo que necesitas es hacer algo como esto:

Código MySQL:
Ver original
  1. FROM partidos
  2. (DATE(lastRefresh) = CURDATE() AND
  3. TIMESTAMPDIFF(MINUTE, lastRefresh, NOW()) > 60)
  4. OR lastRefresh IS NULL

Es básicamente lo mismo que te propuso gnzsoloyo, pero con las consideraciones antes mencionadas.

Saludos
Leo.
  #4 (permalink)  
Antiguo 11/01/2011, 13:33
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Seleccionar registros que cumplan el rango de tiempo

Muchas gracias a ambos,

La idea es tal y como entendiste leonardo_josue, tu ejemplo funciona a la perfección siempre que sea del mismo día la fecha que está mirando en lastRefresh.

Es decir si existe un campo lastRefresh
2010-12-11 20:00:00

Y son las 2011-01-11 20:30:00 no me lo muestra cuando debería...

Cómo salvo este problema de la fecha en la misma sentencia SQL que pusiste? no se me ocurre forma.

Decías que antes debo comparar la fecha para ver si es del día de hoy, pero siguiendo esa reflexión también debería hacer lo mismo con el mes y el año, debería aplicar mas condicionales en la sentencia sino me equivoco pero no veo la forma de juntar tantos!

Muchas gracias de antemano
  #5 (permalink)  
Antiguo 11/01/2011, 14:54
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Seleccionar registros que cumplan el rango de tiempo

Hola de nuevo neodani.

Dices lo siguiente:

Cita:
Iniciado por neodani Ver Mensaje
Es decir si existe un campo lastRefresh 2010-12-11 20:00:00

Y son las 2011-01-11 20:30:00 no me lo muestra cuando debería...
Con esto entiendo que no te importa si existe una diferencia entre la fecha actual y la del lastRefresh, simplemente, si la diferencia es de más de una hora entonces listarlo. Para esto sólo tienes que eliminar la condición donde se iguala con el CURDATE(), es decir, la consulta quedaría así:


Código MySQL:
Ver original
  1. FROM partidos
  2. TIMESTAMPDIFF(MINUTE, lastRefresh, NOW()) > 60 OR
  3. lastRefresh IS NULL

Haz la prueba para ver si es lo que necesitas.

saludos
Leo.
  #6 (permalink)  
Antiguo 11/01/2011, 15:12
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Seleccionar registros que cumplan el rango de tiempo

Funciona perfecto, muchas gracias por la ayuda!

Etiquetas: rango, registros, seleccionar
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:14.