2017-03-23 43 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'子句。 ***不要假设没有它订购***(即使数据“看起来”分类)。 –