2017-03-23 44 views
-1

我想選擇所有小於或等於今天日期的行(但這一部分正在工作),但我不希望今天的$ time是行小於結束時間。SQL - 選擇具有日期和時間條件的行

測試表:{ID,日期,狀態,checkid}

檢查表:{checkid,startt,電磁無損檢測}:開始和結束是象下面這樣的時間值。

$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) 

注:請注意,如果您嘗試合併的日期和時間,讓您可以執行比較單一:這是可能的;但查詢將無法利用索引,所以不可取。


PS:有一個更直接的翻譯你的要求。不幸的是,它有點冗長,優化器可能無法找到最佳方案。

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

而且對於支持EXCEPT從句(顯然許多流行的mysql的除外)平臺:

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({subquery})'是很有用的。正如我所說的EXCEPT非常易讀(支持它的平臺)。如果表現是一個問題,那麼:***(1)測試(2)測量(3)改變(4)比較(5)沖洗重複***。至於排序:在SQL中,只要你想要特定的排序,你就必須使用***顯式的'ORDER BY'子句。 ***不要假設沒有它訂購***(即使數據「看起來」分類)。 –