2016-11-20 12 views
1

これはテーブルです:私は、レコード(複数可)を取得する必要がありますのMySQL:レコードのどこTIMEを取得開始時刻と終了時刻の間( ':YY XX ZZ')

+----+-----------+------------+----------+ 
| id | id_sensor | start_time | end_time | 
+----+-----------+------------+----------+ 
| 1 |  12 | 21:15:00 | 02:45:00 | 
| 2 |   7 | 00:00:00 | 23:15:00 | 
| 3 |   5 | 04:30:00 | 16:30:00 | 
+----+-----------+------------+----------+ 

特定の時間(例えば01 :00:00)の間にPHPが渡されます。 start_timeとend_timeはUTCのTIMEフィールドです。私はphp経由でクエリ時間に渡していますが、phpでuser_timezoneからUTCに変換されています。

SELECT * FROM test WHERE TIME('01:00:00') BETWEEN start_time AND end_time; 

クエリーは、この場合、唯一のレコードID 2、ではない私は両方が必要1.返す(ID 1、終了時刻勿論ための翌日です)。もちろん

我々はTIME('01:00:00' )を探しているならば、我々はは3

はありがとうございIDを必要としない

+0

そして、その範囲がその日を包むのを知るロジックは何ですか?なぜなら、日付フィールドもなければ、開始時刻/終了時刻のそれぞれの組み合わせは、あなたのクエリ、いずれか他の方法と一致します:D – Johnny

+0

@Johhnyこれは私の予想される動作でした。しかし、私のSQLを試してみると、ID 1を取得しません.... – sineverba

+0

あなたは私のコメントを理解していません。返されたくない行で質問を拡張してください。 – Johnny

答えて

1

私は、これはあなたがしたいの論理だと思う。(今

SELECT * 
FROM test 
WHERE (start_time < end_time AND TIME('01:00:00') BETWEEN start_time AND end_time) OR 
     (start_time > end_time AND TIME('01:00:00') NOT BETWEEN end_time AND start_time); 
+0

確かに、それは動作します! id 1の場合にNOT BETWEENが動作する理由を理解できません...しかし、ありがとうございます – sineverba

+0

これは素晴らしいですが、実際にはstart> endのすべてのレコードに一致します。 'start_time> end_time'でなければ、start_timeとend_timeは常に真です。 は' end_time and start_time'ではないでしょう。 – phobia82

+1

'TIME(" 05:00:00 ")のクエリで3つのレコードと一致しますが、1と3だけでなければなりません – phobia82

-1

)は、両方の、現在の時刻と日付を返します。現在の時刻だけを返すcurtime()を使用することもできます。

私はSELECT *を使って作業することは避けてください(多分この例のためだけに使用しています)。明示的に必要なフィールドを一覧表示する方が良いと思います。

+1

私はNOW()と一緒に働くことはできません。あなたのSELECT *をありがとう、私は知っている、それは唯一のテストです...ありがとう – sineverba

関連する問題