2011-01-17 16 views
9

Esto puede ser imposible en la forma en que me gustaría que funcione, pero aquí va.MySQL: Comparar ENTRE el tiempo

SELECT * FROM `table` WHERE CAST('05:00:00' AS time) BETWEEN `start` AND `end` 

Las entradas en la base de datos son:

`start` = '22:59:59' 
`end` = '06:00:00' 

Sin embargo, la consulta no devuelve ningún resultado. Por supuesto, esto funcionaría si hubiera fechas involucradas, sin embargo, no las hay. También funcionaría si el inicio fuera = '00: 00: 00 '.

+1

Entonces, la hora del día es lo único que importa, ¿no la fecha? Dividirlo en dos partes (... entre '00: 00: 00 'y '06: 00: 00') o (entre '22: 59: 59 'y '23: 59: 59') ¿quizás? –

+0

... ¿O invertir la lógica y hacerlo NO ENTRE '06: 00: 00 'Y '22: 59: 59'? –

+0

No pensé en eso, definitivamente una forma de hacerlo, la lógica simplemente no tiene sentido en el contexto de la aplicación. Gracias por la sugerencia, puede ser la única opción. – jmyz

Respuesta

17

Creo que lo que busca es:

SELECT * FROM table WHERE start < CAST('05:00:00' AS time) AND end > CAST('05:00:00' AS time) 

No estoy seguro de si es necesario utilizar los CAST s, aunque esto también debería funcionar.

SELECT * FROM table WHERE start < '05:00:00' AND end > '05:00:00' 
+0

Un punto importante que debe recordarse aquí es que si su horario está formateado en formato de 24 horas, debe coincidir con la consulta, por lo que lo anterior podría ser más probable "SELECT * FROM table WHERE start ​​CAST ('17: 00: 00' AS time) '" – Chiwda

13
SELECT * 
FROM `table` 
WHERE CAST('05:00:00' AS time) BETWEEN `start` AND `end` 
     OR (NOT CAST('05:00:00' AS time) BETWEEN `end` AND `start` AND `start` > `end`) 
+0

a winrar eres –

+1

eres genio! ¡debe ser marcador como respuesta en lugar del marcador actual! –

4

me encontré con esta pregunta y que tenía el mismo problema. Mi solución es la siguiente:

SET @time = '05:00:00'; 

SELECT * FROM `table` 
WHERE IF(
     `start` < `end`, 
     CAST(@time AS TIME) BETWEEN `start` AND `end`, 
     (CAST(@time AS TIME) BETWEEN CAST('00:00:00' AS TIME) AND `end`) OR 
     (CAST(@time AS TIME) BETWEEN `start` AND CAST('24:00:00' AS TIME)) 
    ) = 1; 

Espero que ayude a alguien en el futuro.

¡Gracias Martin por la pista!

1

Podemos comparar el tiempo usando simple a segundos función. Use lo siguiente:

SELECT id 
FROM table1 
WHERE TIME_TO_SEC('2014-03-05 04:17:47') >= TIME_TO_SEC('2014-03-05 04:17:47'); 
Cuestiones relacionadas