2011-01-21 23 views
7

Estoy buscando una manera de seleccionar la fila en la que la hora actual se encuentra entre dos valores establecidos en la fila. Configuré una tabla con 3 columnas, 2 de ellas tienen una marca de tiempo (HH: MM: SS) y la otra una cadena. ¿Hay alguna manera de obtener la cadena correspondiente a la hora actual? Para ponerlo de una manera más abstracta:MySQL Select: WHERE (time now) = BETWEEN tablevalue AND tablevalue

SELECCIONAR Cadena FROM TableName DONDE (Hora actual) ENTRE (Valor de tiempo de límite inferior) Y (Valor de tiempo de límite superior);

alt text

Así que, básicamente, basado en la hora actual, mi guión debe ser la salida de la cadena correcta.

¿Cómo puedo hacer esto? Gracias!

+0

¿Qué tipo son 'low_limit' y' upper_limit'? – Quassnoi

+1

¿Su noche abarca más de dos días? 'ENTRE '22: 00: 00 'Y '05: 00: 00'' probablemente no devuelva lo que espera. – eumiro

+0

@eumiro: ¡buen punto! – Mchl

Respuesta

5

En MySQL, marca de tiempo es bastante una palabra confusa.

Si son lowerlimit y upperlimit son TIME columnas de 00:00:00 a 23:59:59:

SELECT String 
FROM TableName 
WHERE CURTIME() BETWEEN lowerlimit AND upperlimit 
     OR CURTIME() BETWEEN SUBTIME(upperlimit, '24:00:00') AND lowerlimit 
     OR SUBTIME(CURTIME(), '24:00:00') BETWEEN SUBTIME(upperlimit, '24:00:00') AND lowerlimit 

Este se encargará de transiciones medianoche correctamente.

+1

Cometió el mismo error al principio. NOW() también contiene la parte de fecha. CURTIME() debe ser utilizado. Downvote no de mí. – Mchl

+0

@Mchl: ¿por qué habría de hacerlo? – Quassnoi

+0

?? No estoy seguro de lo que está preguntando. De todos modos, ahora tu respuesta encaja con la pregunta mucho mejor que otras. – Mchl

2

La manera que lo hizo es más o menos que:

SELECT String FROM TableName WHERE CURTIME() BETWEEN (Lower Limit Time Value) AND (Upper Limit Time Value); 
+0

¿Los corchetes también son correctos en MySQL? No estoy familiarizado con la sintaxis y actualmente estoy usando 'Something' (las 'citas' normales no funcionan) en mis consultas a través de PHP. – Chris

+0

No. Las barras de retroceso (') son la forma correcta de delimitar nombres de columna no estándar. es decir, – Mchl

4
SELECT string_col 
FROM your_table 
WHERE CURTIME() BETWEEN lower_limit_col AND upper_limit_col 
+0

Gracias por mostrar que debería usar los nombres de las columnas :-) – Chris

2

el tipo de las dos columnas debe ser el tiempo (y no la marca de tiempo). Entonces, la respuesta está en la pregunta:

select string from tablename where curtime() between lowerlimit and upperlimit 

Sólo asegúrese de que duerma la noche ir 22:00:00-06:00:00 sin embargo, o no va a funcionar. Pero puede introducir dos intervalos para el poder: uno de 22:00:00 a 24:00:00 y otro de 00:00:00 a 06:00:00.

+0

Ah, afortunadamente no tengo esas transiciones, ¡gracias por los avisos! – Chris