2013-09-30 13 views
0

我要检查日期上的表的datecolumn是否处于另一两组从其他表日期的范围的条件..如何在MYSQL的查询中指定空日期?

第一表:

1. id 
2. name 
3. date 

第二表;

1. id 
. 
. 
. 
. 
17 : Start Date 
18 : End Date 

我要检查第一表的date字段是否是在Start Date和第二表的End Date范围。

例如

t1.date>= t2.Start Date and t1.date <= t2.End Date 

问题是,有一些行,其中t2为空.. 如果是null,然后第二个条件回报true

首例

t1.date = 26-Nov-2011 
t2.Start Date = 25-Nov-2011 
t2.End Date = 27-Nov-2012 
*Passed* 

第二种情况

t1.date = 26-Nov-2011 
t2.Start Date = 25-Nov-2011 
t2.End Date = 25-Nov-2011 

    *FAILED* 

第三种情况

t1.date = 26-Nov-2011 
t2.Start Date = 27-Nov-2011 
t2.End Date = 27-Nov-2011 

    *FAILED* 

第四种情况

t1.date = 26-Nov-2011 
t2.Start Date = 25-Nov-2011 
t2.End Date = null 

    *Passed* 

请帮忙。

+0

使用'BETWEEN'语句代替'> = AND <='为sta rters。 –

回答

4

因此,基本上,您希望将没有结束日期的情况视为“正在进行”的情况,因此,如果第一个条件为真,则应该为真。

  1. 的日期之后或在开始日期和
  2. 答:基本上,如果条件满足。日期在结束日期之前或结束日期或
    b。没有结束日期

现在很容易做到的SQL:

(t1.date>= t2.StartDate) and ((t1.date <= t2.EndDate) or (t2.EndDate is null)) 

注意,你可以得到类似的结果使用betweenisnull,但就我而言,这是更清晰如果条件是不言自明的,我可以把它们看作明文。


(老答案,假设整个t2行空,从左连接下)

您可以再补充一个条件,第二行不为空,即该领域t2.StartDatet2.EndDate不是空

(t1.date>= t2.Start Date and t1.date <= t2.End Date and t2.End Date is not null) 
+0

在上面的解决方案中,如果结束日期为空,则该语句返回false ..但是,如果第一个条件为真,它应该返回true。 – Shashi

+0

这与问题中提到的不同。这意味着整个't2'行是空的,如从左连接。请编辑问题并澄清条件。 – SWeko

+0

问题更新.. :) – Shashi

0

有可能让你使用IS NOT NULL

那么它会是这个样子

(t1.date BETWEEN t2.Start Date and t2.End Date AND t2.End Date IS NOT NULL) 

,并顺便说一句,你不应该使用空格在你的列名中,改用endDate或end_date(我更喜欢endDate)

+0

在上述解决方案中,如果结束日期为空,则该语句返回false ..但如果第一个条件成立,它应该返回true。 – Shashi

+0

如果结束日期为空,则第一个仍然为空,否则您必须指定您的意思 –

+0

更新问题 – Shashi