2011-01-17 21 views
9

Dies kann unmöglich sein in der Art, wie ich es hätte arbeiten wollen, aber hier geht.MySQL: Vergleichen ZWEITE Zeit

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

Die Einträge in der Datenbank vorhanden sind:

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

jedoch die Abfrage keine Ergebnisse. Natürlich würde das funktionieren, wenn es Termine gäbe, aber nicht. Es würde auch funktionieren, wenn der Start war = '00: 00: 00'.

+1

So ist Tageszeit nur noch wichtig, kein Datum? Teile es in zwei Teile (... zwischen '00: 00: 00 'und '06: 00: 00') oder (zwischen '22: 59: 59 'und '23: 59: 59') vielleicht? –

+0

... Oder invertieren Sie die Logik und machen Sie nicht zwischen '06: 00: 00 'und' 22: 59: 59 '? –

+0

Dachte nicht, definitiv eine Möglichkeit, es zu tun, die Logik macht nur im Kontext der Anwendung keinen Sinn. Danke für den Vorschlag, vielleicht die einzige Option. – jmyz

Antwort

17

ich denke, was Sie suchen ist:

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

Ich bin nicht sicher, wenn Sie die CAST s verwenden müssen, dies sollte auch funktionieren.

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

Ein wichtiger Punkt, an den Sie sich erinnern sollten, ist, dass, wenn Ihre Zeiten im 24-Stunden-Format formatiert sind, Sie sie in der Abfrage abgleichen müssen, so dass das obige sehr wahrscheinlich ist. 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

ein winrar bist du –

+1

du bist genial! Es muss Marker als Antwort anstelle des aktuellen sein! –

4

Ich kam gerade über diese Frage und ich hatte das gleiche Problem. Meine Lösung ist wie folgt:

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; 

Ich hoffe, es hilft jemandem in der Zukunft.

Vielen Dank Martin für den Hinweis!

1

Wir können die Zeit mit einfachen Zeit zu Sekunden Funktion vergleichen. Verwenden Sie Folgendes:

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