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

Consulta entre horas

Estas en el tema de Consulta entre horas en el foro de Mysql en Foros del Web. Saludos Tengo una tabla eventos con la siguiente estructura: idevento integer fecha date hinicio time hfinal time lugar varchar(30) Necesito una consulta que antes de ...
  #1 (permalink)  
Antiguo 10/06/2009, 13:32
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Consulta entre horas

Saludos

Tengo una tabla eventos con la siguiente estructura:

idevento integer
fecha date
hinicio time
hfinal time
lugar varchar(30)

Necesito una consulta que antes de registrar un evento, me diga si hay eventos registrados para ese lugar y fecha entre las horas que el usuario ingrese.
Si la consulta presenta un registro, capturo la información y la pongo como mensaje de advertencia (Hay un evento en la fecha xx entre las xx y xx), si no encuentra ningún registro, procede a insertar en la base de datos el evento.

Pensé que la había logrado así:
Código mysql:
Ver original
  1. select lugar,actividad,fecha,hinicio,hfinal from eventos
  2.  where fecha = '2009-06-10' and lugar='Salon comunal'
  3. and (time_to_sec('02:00:00') between time_to_sec(hinicio)
  4. and time_to_sec(hfinal)) limit 1;

Donde 02:00:00 sería la hora de inicio del evento entrante, pero si pongo en el formulario una hora de inicio inferior a finicio y una hora superior a final, me deja registrar el evento.

Alguna idea para validar esto?

Desde el formulario, entrarían una hora inicial y una hora final del evento.

Mil Gracias
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #2 (permalink)  
Antiguo 10/06/2009, 14:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta entre horas

pienso que debes hacer funcionar como un datetime para hacer el between, es decir, comparar un fecha hora between fecha hora and fecha hora, y sin convertir a segundos las horas.
SELECT lugar,actividad,fecha,hinicio,hfinal FROM eventos
WHERE CAST(concat ('2009-06-10', ' ','02:00:00') AS DATE)
BETWEEN CAST(CONCAT(fecha,' ',hinicio) AS DATE) AND CAST(CONCAT(fecha,' ',hfinal) AS DATE)

Es la idea. Ni siquiera la he probado. Otras soluciones mejores con str_to_date() para sacar la fecha. Pero la idea es que la hora no puede separarse del día. Comparas día hora con día hora.
Por si te sirve, amigo. Y luego añades lo del lugar, claro.

Te he respondido rápido, sin hacer pruebas, porque veo que es un problema conceptual y porque sé que buscarás por ti mismo la mejor consulta.
  #3 (permalink)  
Antiguo 10/06/2009, 14:47
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta entre horas

Jurena... casi casi le das..

Por un momento pensé que ya había funcionado.
Pero, si tengo registrado un evento y entre la 1:00:00 y las 5:00:00, y quiero ingresar un evento entre las 00:15:00 y las 00:45:00, me retorna el registro.

Pero con lo que acabas de poner, seguiré enfocando el problema por esa ruta. La verdad estaba atascado con esto.

Mil gracias jurena.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 10/06/2009, 14:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta entre horas

Ahora has introducido otro dato que yo no había visto, es decir, me hablas de un rango horario también para la entrada. Mira el post de avatar810 donde resolvía esa consulta de la mejor manera posible; en ese caso usando >=, etc.
http://www.forosdelweb.com/f86/selec...fechas-693114/
Pensé que me decías una hora, pero si es un rango, adapta la sintaxis de avatar810. Pero no olvides que tendrás que trabajar con dia hora en los cuatro casos.

... where fecha horanicioformulario<=fecha hfinal
and
fecha horafinformulario>=fecha hinicio

esto te encuentra las coincidencias...

Última edición por jurena; 10/06/2009 a las 14:59
  #5 (permalink)  
Antiguo 10/06/2009, 15:24
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta entre horas

Cita:
... where fecha horanicioformulario<=fecha hfinal
and
fecha horafinformulario>=fecha hinicio
Amigo

Con las pocas pruebas que he realizado, parece funcionar perfecto. lastima que no pueda darte mas karma...
por que hay limitantes con eso?

En fin... la consulta quedó así:

Código mysql:
Ver original
  1. SELECT lugar,actividad,fecha,hinicio,hfinal FROM eventos WHERE
  2. (
  3. CAST(concat('2009-06-10',' ','05:15:00') AS DATETIME) < CAST(CONCAT(fecha,' ',hfinal) AS DATETIME)
  4. CAST(concat('2009-06-10', ' ','06:45:00') AS DATETIME) >= CAST(CONCAT(fecha,' ',hinicio) AS DATETIME)
  5. );

Mañana continúo en proceso de pruebas y comento cualquier inconveniente.

Mil gracias.

EDITO--
Creo que puedo tener unos pequeños problemas, cuando se traslapen la hora de inicio de un evento con la hora de finalización.
Ya que el sistema, debe poder reservar una sala entre las 5:15 y las 6:00 y reservar otra a las 6:00. Pero eso ya son detalles que mañana miraré.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 11/06/2009, 07:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta entre horas

Hice todas las pruebas posibles y me funciona perfecto.

Comparto la consulta definitiva por si alguien tiene el mismo problema.

Código mysql:
Ver original
  1. SELECT lugar,actividad,fecha,hinicio,hfinal FROM eventos WHERE str_to_date('10/06/2009','%d/%m/%Y')
  2. and lugar='Salon Comunal' and
  3. (
  4. DATE_ADD(CAST(CONCAT(STR_TO_DATE('10/06/2009','%d/%m/%Y'),' ','05:14:00') AS DATETIME),INTERVAL 1 MINUTE) <= CAST(CONCAT(fecha,' ',hfinal) AS DATETIME)
  5. DATE_SUB(CAST(CONCAT(STR_TO_DATE('10/06/2009','%d/%m/%Y'),' ','06:01:00') AS DATETIME),INTERVAL 1 MINUTE) >= CAST(CONCAT(fecha,' ',hinicio) AS DATETIME)
  6. );

La suma y resta de un minuto, es para que la validación, no se caiga cuando se trate de registrar un evento que empieza a una hora que termina otro evento.

Muchas gracias Jurena.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 11/06/2009, 07:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta entre horas

Yo te iba decir que sumaras y restaras un segundo, y que probaras con str_to_date(CONCAT...).
Gracias por compartir la consulta, huesos52.

Y por cierto, el mejor karma para mí es poder ayudar, aunque sea un poco, a quien tanto ayuda.
  #8 (permalink)  
Antiguo 11/06/2009, 08:09
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta entre horas

Cita:
Yo te iba decir que sumaras un segundo, y que probaras con str_to_date(CONCAT...).
Podría mejorarla jurena?
Cualquier opinión es bien recibida.

Como sería el concat dentro del str_to_date?

Me imagino que te refieres a:

str_to_date(concat('10/06/2009',' ','08:00:00'),'%d/%m/%Y %H:%i:%s');

Quedaría mejor?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 11/06/2009, 08:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta entre horas

No se trata de que quede mejor, sino de si es más eficiente. No tengo datos ni en un sentido ni en otro (no lo he probado), es decir, quitaría el casting a datetime y probaría con esa función solamente, aunque no he hecho pruebas de ningún tipo, y tampoco con el DATE_ADD() y DATE_SUB. Mis conocimientos técnicos son nulos y no sabría decirte, pero yo lo probaría.
Saludos
  #10 (permalink)  
Antiguo 11/06/2009, 08:53
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta entre horas

OK jurena..

probaré ambas formas. Aunque, como te puedes dar cuenta, esta consulta retornará 0 o 1 registros, así que la eficiencia no creo que sea un problema.

Te debo el karma, para cuando pueda ponerlo. jejeje

Muchas gracias por todo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 11/06/2009, 09:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta entre horas

Entiendo, huesos52, pero si funciona la que te propongo estaríamos haciendo sólo una conversión a datetime mediante la función str_to_date(), mientras que la opción que por el momento parece funcionar está haciendo una conversión a tiempo de algo que ya está convertido a tiempo mediante str_to_date, es decir, dos conversiones a datetime, y la segunda parecería innecesaria si es que funciona sin tener que usarla. Y, además, siempre es preferible lo que es mejor (si es que funciona) que lo que está bien.
  #12 (permalink)  
Antiguo 11/06/2009, 09:14
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta entre horas

Cita:
ya está convertido a tiempo mediante str_to_date, es decir, dos conversiones a datetime, y la segunda parecería innecesaria si es que funciona sin tener que usarla. Y, además, siempre es preferible lo que es mejor (si es que funciona) que lo que está bien.
Tienes toda la razón jurena.
ya mismo la cambio.

Gracias de nuevo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
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 16:21.