2016-05-27 6 views
0

私が直面している問題は非常に複雑ではなく、ここにはいくつかの答えがありますが、私は必要なときに問題を解決していません。 私は、timefromとtimetoという名前のVARCHAR型の2つのフィールドを持つテーブルを持っています。 これらのフィールドには、時刻が12:00、05:18,00:05の形式で格納されます。日付はありません。秒はありません。時間は24時間です。 starttimeとendtimeという2つのフィールドを持つフォームがあります。そして、ユーザーの開始時刻と終了時刻が交差するデータベースから、DBのtimefromとtimetoフィールドのすべての行を選択したいとします。mysqlデータベースに格納された2回の時間の交点を見つける方法

"SELECT * FROM reservation WHERE ((timeto>='$timefrom' AND timeto<='$timeto') OR (timefrom>='$timefrom' AND timefrom <='$timeto'))" 

このクエリは、交差点のすべての種類のために動作しますが、ユーザーによって与えられた時間はDBに保存されている時間内に収まるいない場合: は、私は次のクエリを持っています。 たとえば、DB timefrom = 20:00、timeto = 23:00、ユーザー入力starttime = 21:00およびendtime = 22:00の場合、問合せはいずれの交差点も戻さずに済むはずです。 誰でも私に信頼できる解決策を見せることができれば、大きな助けになるでしょう。ユーザーの時間がtimetotimefromの間にある場合THANKSは

答えて

1

保存する単純な文字列として日付/時間の任意の並べ替えは良いアイデアではありません。

このような何か試してみてください:

SELECT * FROM reservations 
WHERE 
TIME_FORMAT(timefrom, '%H:%i') >= '21:00' AND TIME_FORMAT(timeto, '%H:%i') <= '23:00' 
+0

これは動作していないと私はなぜ – DevMan

+0

私の悪い、私はそれをテストしていない理由を知らない。 –

+0

これはうまくいきましたが、まだこのクエリーで解決されていない問題があります。私のstarttimeが19:00で、endtimeが21:00(つまり、endtimeがdbに格納されたstarttimeに等しいことを意味する)であれば、クエリは行を返しますが、交差点がないのですべてのクエリの中の<= and > =演算子です。これには解決策がありますか? – DevMan

0

さて、あなただけの第三のチェックを追加することができます。

OR (timefrom <= '$timefrom' AND timeto >='$timeto') 

これはあまりにも間に時間を持つ行を、あなたを吐き出すだろう。

MySQLはintersectフィルタも提供しています。 thisを見てください。 ここでは、見えるように行を指定して、値との交差を提供する行を選択したいと言うことができます。

+0

INTERSECTフィルタは、変数に対して二つ以上のテーブルの値をチェックしていないためです。 – DevMan

1

ユーザの入力開始時刻またはユーザ入力終了時刻のいずれかが時間制限の間にあることを確認するだけではどうですか。また、DB開始時刻と終了時刻の両方がユーザーの開始時刻と終了時刻の間にあるかどうか。それは交差点を意味します。あなたは、MySQL自体が提供する日付&時間を操作するためのアウトオブボックスの機能を失うので

SELECT * FROM reservation WHERE ('$timefrom' BETWEEN timeto AND timefrom) OR ('$timeto' BETWEEN timeto AND timefrom) OR ('$timefrom' <= timefrom AND '$timeto' >= timeto) 
+0

$ timefromよりも少なく、$ timetoよりも(timeto、timefrom)間隔よりも長い場合は? – splash58

+0

私の悪い、私はそれを逃した。ありがとう私は私の答えを更新する –

関連する問題