2017-10-01 6 views
-1

mysql datetime wählen problem.mysql zeit wählen wo vergleichen

mein Tisch check_time:

count = 1 
start = 23:57:45 
end = 00:02:10 

count = 2 
start = 00:02:45 
end = 00:07:10 

ich diese Abfrage versucht:

select count 
from check_time 
where start <= DATE_FORMAT(now(), '%H:%i:%s') 
    and end >= DATE_FORMAT(now(), '%H:%i:%s'); 

i die jetzt will() = "23.57.45" zwischen "00.02.10" wählen -> count = 1

funktioniert nicht nur bei count 1.

aber vollkommen andere Zählung 2 ~ 100 ..

sorry für mein schlechtes Englisch zu arbeiten.

+2

Sie müssen erklären, was Sie zu tun versuchen. –

+0

ich will das jetzt() = "23:57:45" zwischen "00:02:10" wählen -> count = 1 – Kokoas

+0

Was ist der tatsächliche Datentyp, den Sie für die Spalten "Start" und "Ende" verwendet haben? Sind diese "Zeit" -Spalten? oder "varchar" Spalten? Liefern Sie DDL der Tabelle –

Antwort

0

Viel hängt davon ab, wie Sie tatsächlich die Spalten start und end definiert haben. Ich habe angenommen, dass sie im Folgenden "Zeit" -Spalten sind.

Beachten Sie auch, dass, um das Problem der Verwendung der Serverzeit zu vermeiden, die ich nicht kontrollieren konnte, ich @curtime verwendet habe, aber in Ihrem Code sollten Sie stattdessen CURTIME() verwenden. Sehen Sie sich die Demonstration Demonstration auf SQL Fiddle

CREATE TABLE check_time 
    (`count` int, `start` time, `end` time) 
; 

INSERT INTO check_time 
    (`count`, `start`, `end`) 
VALUES 
    (1, '23:57:45', '00:02:10'), 
    (2, '00:02:45', '00:07:10') 
; 

Abfrage 1:

set @curtime:= cast('23:57:45' as time) 
select 
* 
, @curtime 
from check_time 
where (
     (`start` < `end` and @curtime between `start` and `end`) 
    OR (`start` > `end` and 
       (@curtime between `start` and cast('24:00:00' as time)) 
      OR (@curtime between cast('00:00:00' as time) and `end`) 
      ) 
    ) 

Results:

| count | start |  end | @curtime | 
|-------|----------|----------|----------| 
|  1 | 23:57:45 | 00:02:10 | 23:57:45 | 

Abfrage 2:

set @curtime:= cast('00:02:45' as time) 
select 
* 
, @curtime 
from check_time 
where (
     (`start` < `end` and @curtime between `start` and `end`) 
    OR (`start` > `end` and 
       (@curtime between `start` and cast('24:00:00' as time)) 
      OR (@curtime between cast('00:00:00' as time) and `end`) 
      ) 
    ) 

Results:

| count | start |  end | @curtime | 
|-------|----------|----------|----------| 
|  2 | 00:02:45 | 00:07:10 | 00:02:45 | 
+0

Ich werde diese Antwort noch einmal überdenken müssen, da ich festgestellt habe, dass das einfache Umdrehen von Anfang/Ende zu Ende nicht genau ist –

+0

Ich habe mein Original durch die Version ersetzt, die ich oben gesehen habe (mit Variable @curtime) –