2011-01-21 17 views
7

Sto cercando un modo per selezionare la riga in cui l'ora corrente si trova tra due valori impostati nella riga. Ho impostato un tavolo con 3 colonne, 2 di esse contengono un timestamp (HH: MM: SS), l'altro una stringa. C'è un modo per ottenere la stringa corrispondente all'ora corrente? Per dirla in un modo più astratto:MySQL Seleziona: DOVE (ora) = TRA valore tabella E valore tabella

SELECT String FROM TableName WHERE (Current Time) TRA (Valore limite inferiore) E (Valore limite superiore);

alt text

Quindi, fondamentalmente, in base al tempo corrente, il mio script dovrebbe restituire la stringa corretta.

Come faccio a fare questo? Grazie!

+0

Quale tipo sono 'lower_limit' e' upper_limit'? – Quassnoi

+1

La tua notte dura più di due giorni? 'FRA '22: 00: 00 'E '05: 00: 00'' probabilmente non restituirebbe ciò che attendi. – eumiro

+0

@eumiro: buon punto! – Mchl

risposta

5

In MySQL, timestamp è una parola piuttosto confusa.

Se sono lowerlimit e upperlimit sono TIME colonne da 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 

Questo consente di gestire in modo corretto le transizioni di mezzanotte.

+1

ha fatto lo stesso errore all'inizio. ORA() contiene anche la parte della data. CURTIME() dovrebbe essere usato. Downvote non da me. – Mchl

+0

@Mchl: perché dovrei? – Quassnoi

+0

?? Non sei sicuro di cosa stai chiedendo. Ad ogni modo ora la tua risposta risponde alla domanda molto meglio di altre. – Mchl

2

Il modo in cui l'avete fatto è praticamente esso:

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

Anche le parentesi sono corrette in MySQL? Non ho familiarità con la sintassi e attualmente sto usando 'Something' (le normali 'virgolette' non sembrano funzionare) nelle mie query via PHP. – Chris

+0

No. I backtick (') sono il modo corretto per delimitare i nomi di colonna non standard. Ad esempio, – Mchl

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

Grazie per aver mostrato dovrei usare i nomi delle colonne :-) – Chris

2

il tipo di due colonne deve essere il tempo (e non il timestamp). Quindi, la risposta è nella tua domanda:

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

Basta fare in modo che la notte pretende molto andare 22:00:00-06:00:00 però, o non funzionerà. Ma potresti introdurre due intervalli per il potere: uno dalle 22:00:00 alle 24:00:00 e un altro dalle 00:00:00 alle 06:00:00.

+0

Ah, non ho fortunatamente quelle transizioni, grazie per l'heads-up! – Chris

Problemi correlati