2017-03-23 16 views
-1

今日の日付以下である行をすべて選択しようとしていますが(この部分は動作しています)終了時間よりも短い。SQL - 日付と時刻の条件を持つ行を選択する

試験表:{ID、日付、状態、checkid}

チェックテーブル:{checkid、STARTT、endt}:開始と終了は、以下のような時間値です。

$time = '15:00:00'; 

$query = ("SELECT test.ID, test.status, check.startt, check.endt FROM test INNER JOIN check ON test.checkid=check.checkid 
WHERE test.date <='$date' AND $time < check.endt"); 

時刻がチェックテーブルの終了時刻よりも小さい場合、クエリでは何も表示されません。私は間違って何かをしていることを知っているが、私はそれを把握できません、私はif文atmを試しています。

+0

$ time> check.endt –

答えて

0

説明した内容を基本的にコードします。日の特別取り扱いの際はtest.date =「今日」

条件「1」だけは常に適用されます(しかし、今日除く)
条件「2」(今日のための)日付と時刻の両方を必要とします。

WHERE test.date < $date 
     OR (test.date = $date AND check.endt <= $time) 

NB:あなたはを試す場合は、単一の比較実行できるように日付と時刻を組み合わせることに注意してください。これが可能であるが、クエリはインデックスを活用できないため、お勧めできません。


PS:あなたの要件のより直接的な翻訳があります。残念ながらもう少し冗長であり、最適化プランが最適なプランを見つけられない可能性があります。 EXCEPT句(mysqlのEXCEPT明らかに多くの人気のあるもの)をサポートするプラットフォームのためにも

where test.date <= $date 
    and test.id not in (
     select test.id 
     from ... 
     where test.date = $date 
      and check.endt > $time 
     ) 

select Col1, Col2 
from ... 
where test.date <= $date 
except 
select Col1, Col2 
from ... 
where test.date = $date and check.endt > $time 

EXCEPT構文は、それは非常に冗長だにもかかわらず、非常に自然に読み込みます。

+0

それを働かせてくれてありがとう、if else文で非常に多くの時間を費やしました。 –

+0

追加のコメントありがとう、他の方法は、クエリを完了するだけで効率を提供していますか?また、あなたが注文した状態は? –

+1

@ S.S彼らは問題への代替アプローチです。複雑な条件を単純なwhere節に変換することは必ずしも容易ではありません。だから、 'NOT IN({副問い合わせ})'を使う方法を知っておくと便利です。 EXCEPTは非常に読みやすく(サポートしているプラ​​ットフォーム用)パフォーマンスが懸念される場合は、***(1)テスト(2)測定(3)変更(4)比較(5)すすぎ - リピート***。順序付けについて:特定の順序付けが必要なときはいつでも、SQLでは***明示的な 'ORDER BY'節を使用する必要があります。 ***(データが "ソート"されている場合であっても)***注文なし​​とは決して考えないでください。 –