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

between entre dos horas

Estas en el tema de between entre dos horas en el foro de Mysql en Foros del Web. Hola, Me gstaria una manito con esto. Tengo una aplicacion donde el usuario introduce unos datos con hr_i y hr_f Esos datos se almacenan en ...
  #1 (permalink)  
Antiguo 25/05/2009, 07:57
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
between entre dos horas

Hola,
Me gstaria una manito con esto.

Tengo una aplicacion donde el usuario introduce unos datos
con hr_i y hr_f

Esos datos se almacenan en una tabla llamada tbduser

La cual su estructura es


Usuario | hr_i | hr_f


Necesito que antes de almacenar los datos del usuario
el sistema haga una consulta , para comprobar si no existe un dato con horas igual ala que desea instroducir el usuario o este entre las instroducidas
por el usuario.


Ejempl.


Código:
Usuario  |     hr_i         |	        hr_f
 Miguel	      00:01:00	 	    16:00:00

Si miguel desea instroducir otro dato con hora de

02:01:00 , 17:00:00 El sistema debe de restringir el insert.



Se que esto se logra con un between pero no se realmente como aplicarlo
ya que lo he intentado pero a un me da error.
  #2 (permalink)  
Antiguo 25/05/2009, 08: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: between entre dos horas

¿Qué error te da?
Postea la sentencia que usas, para ver donde está el problema.
__________________
¿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 25/05/2009, 08:22
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: between entre dos horas

SELECT * FROM tbduser WHERE (usuario='miguel') and (hr_i between '00:00:00' and '08:00:00') or (hr_f between '00:00:00' and '08:00:00')

Algo haci es mi consulta.

Quisiera saber si es la mejor forma
  #4 (permalink)  
Antiguo 25/05/2009, 09:22
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: between entre dos horas

La sentencia en sí es esencialmente correcta (solamente son innecesarios los paréntesis que encierran esto: usuario='miguel'). Lo que debes comprender es qué es lo que te devuelven: Te devolverá registros si hr_i esta entre '00:00:00' y '08:00:00', pero también si hr_f está entre '00:00:00' y '08:00:00'.
Esto implica que si se pone una hora cruzada, por ejemplo, '03:35:39' y '08:21:15', también te lo devolverá.
No queda claro si estás considerando estas dos alternativas (cruzado al inicio y cruzado al final), por lo que te lo menciono.
Si lo que quieres es el rango contenido entre las cotas de tiempo, BETWEEN por allí no es funcional, porque lo que tienes que hacer es comparar cad campo con una sola cota:

Código sql:
Ver original
  1. SELECT *
  2. FROM tbduser
  3. WHERE usuario='miguel'
  4. AND (hr_i >=  '00:00:00'  AND hr_f <= '08:00:00');
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/05/2009, 09:57
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: between entre dos horas

Gracias gnzsoloyo

Esta es mi consulta.
Código:
SELECT * FROM tbduser WHERE usuario='Miguel' and (Hr_i>='04:00:00' or Hr_f<='13:00:00');
+--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
| Codigo | Usuario | Tuso | Hr_i     | Hr_f     | User_Insert | User_Update | Date_Insert         | Date_Update         |
+--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
|     36 |Miguel   | 2    | 05:00:00 | 07:00:00 | Carlo        |Carlo        | 2009-05-25 00:00:00 | 2009-05-25 00:00:00 |
|     35 |Miguel   | 2    | 00:00:00 | 12:00:00 | Carlo        |Carlo        | 2009-05-25 00:00:00 | 2009-05-25 00:00:00 |
+--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
2 rows in set (0.00 sec)
  #6 (permalink)  
Antiguo 25/05/2009, 11:04
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: between entre dos horas

Si no pones AND en vez de OR en la sentencia en la comparación te dará siempre el mismo error de datos devueltos que usando BETWEEN.
Para tomar sólo los registros comprendidos entre las dos cotas debe ir si o si AND, no OR.
Si lo usas así
Código sql:
Ver original
  1. SELECT *
  2. FROM tbduser
  3. WHERE usuario='Miguel' AND (Hr_i>='04:00:00' AND Hr_f<='13:00:00');
Te devolverá esto:
Código:
SELECT * FROM tbduser WHERE usuario='Miguel' and (Hr_i>='04:00:00' or Hr_f<='13:00:00');
+--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
| Codigo | Usuario | Tuso | Hr_i     | Hr_f     | User_Insert | User_Update | Date_Insert         | Date_Update         |
+--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
|     36 |Miguel   | 2    | 05:00:00 | 07:00:00 | Carlo        |Carlo        | 2009-05-25 00:00:00 | 2009-05-25 00:00:00 |
+--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
1 rows in set (0.00 sec)
__________________
¿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 25/05/2009, 11:25
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: between entre dos horas

Perdona gnzsoloyo,


pero mira esta consulta me trae cero registro.

Código query:
Ver original
  1. mysql>SELECT * FROM tbduser WHERE usuario='Miguel' and (hr_i >= '03:00:00' and hr_f<= '14:00:00');



Pero si consulto la tabla tengo un registro lo cual la consulta de arriba deveria de mostrarme este resultado ya que esta entre los parametros puesto.
Código query2:
Ver original
  1. mysql> select * from tbduser;
  2. +--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
  3. | Codigo | Usuario  |  Tuso | Hr_i     | Hr_f     | User_Insert | User_Update | Date_Insert         | Date_Update         |
  4. +--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
  5. |     47 | Miguel  |   2   | 00:00:00 | 09:00:00 | Carlos        | Carlos        | 2009-05-25 00:00:00 | 2009-05-25 00:00:00 |
  6. +--------+---------+--------------+------+----------+----------+-------------+-------------+---------------------+---------------------+
  7. 1 row in set (0.00 sec)
  #8 (permalink)  
Antiguo 25/05/2009, 12:04
Avatar de Anubis_Slash  
Fecha de Ingreso: mayo-2009
Ubicación: aqui y haya
Mensajes: 173
Antigüedad: 15 años
Puntos: 5
Respuesta: between entre dos horas

me parece que el error puede estar en que tu rango de busqueda lo tienes desde las 03:00:00 hr_i hasta 14:00:00 y en el registro de la base de datos es hr_i es 00:00:00 intenta modificar los margenes de la hr_i

saludos

intenta esto:

mysql>SELECT * FROM tbduser WHERE usuario='Miguel' and (hr_i >= '00:00:00' and hr_f<= '14:00:00');
  #9 (permalink)  
Antiguo 25/05/2009, 13:56
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: between entre dos horas

Es exactamente lo que te dice Anubis_Slash: Eso te trae cero registros porque la cota inferior (03:00:00)es posterior al inicio (00:00:00) que aparece en el registro.
Es el caso de períodos cruzados que te mencionaba. El final cae dentro de las cotas, pero no el comienzo.
Lo que debes definir bien es cuál es el período buscado.
__________________
¿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 29/09/2012, 00:16
Avatar de zeuzft  
Fecha de Ingreso: junio-2009
Ubicación: peru
Mensajes: 358
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: between entre dos horas

tengo el mismo problema pero con el formato de 12 horas intento hacer el between; pero si le pongo un rago de hora inicio 12 y hora fin 2; no me da ningun registro
Cita:
select idExamen, examen, horafin,ampm, fechaexamen, horaexamen
from examen
where idLeccionxNivel = '7'
and fechaexamen=CURDATE()
and TIME_FORMAT( CURTIME( ) , '%r')
between CONCAT(`horaexamen`,' ',`ampm`) and
CONCAT(`horafin`,' ',`ampm`)
saben xq? si pongo los concat en el select si me arroja un resultado; claro quitando del where pero necesito ese filtrado.
  #11 (permalink)  
Antiguo 29/09/2012, 04:13
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: between entre dos horas

Tienes un error básico: Las horas se deben almacenar como TIME y su rango es entre 00:00:00 y 23:59:59, por lo que no tiene ningún sentido ni utilidad ponerles AM o PM. No estás usando SQL Server. Como consecuencia, el BETWEEN que pretentes hacer no te funcionará porque no está evaluando las horas de los CONCAT() como horas, sino como cadenas de texto, y deben ser valores escalares.
Para que funcione, debes obtener algo como:
Código MySQL:
Ver original
  1. SELECT idExamen, examen, horafin,ampm, fechaexamen, horaexamen
  2. FROM examen
  3. WHERE idLeccionxNivel = 7
  4.     AND fechaexamen=CURDATE()
  5.     AND CURTIME() BETWEEN '12:00:00' AND '14:00:00'
Desde el punto de vista lógico, esta consulta sólo te devolverá datos si la ejecutas en el horario del examen. SI la haces correr antes o después, no servirá. No te dará registros.

Finalmente: No cuelgues post propios de temas ajenos para hacer preguntas propias, ni aún cuando las preguntas tengan alguna relación. En los foros, eso se considera un acto de falta de cortesía y mala educación.
Corresponde que abras un tema propio.

Tampoco resucites post antiguos. Eso puede hacer que los moderadores te lo cierren y nunca obtengas respuestas (no lo hice porque no modero este foro), ya que viola reglas expresas de las Políticas de Uso.

Saludos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 19:28.