2016-03-08 147 views
0

我有两个记录在我的桌子:SQL条件where子句

表:

ID StartDate EndDate 
1 2013-01-01 2016-01-01 
2 2016-02-01 NULL 

我的查询:

@DatePeriodFrom = 2016-01-01 
@DatePeriodTo = 2016-01-01 

select * 
from tableabove ta 
where (ta.StartDate >= @DatePeriodFrom and ta.EndDate >= @DatePeriodTo) 

我在这里的问题是,它会返回任何结果。如果我用or替换and,它将返回两行。我正在考虑使用ISNULL,但我没有运气。

编辑

我想是返回从给定的起始日期和结束日期,如果不考虑行具有空结束日期基于该行。

在上面的例子中,应该返回第一行。

在这个例子中,第二行应返回:

@DatePeriodFrom = 2016-02-01 
@DatePeriodTo = 2016-02-01 

任何想法?

回答

0

在情况下,如果你需要找到时间的所有路口:

where ta.StartDate <= @DatePeriodTo 
    and (ta.endDate IS NULL or ta.endDate >= @DatePeriodFrom) 
1
select * 
from tableabove ta 
where ta.StartDate <= @DatePeriodFrom and (ta.endDate is NULL or ta.EndDate >= @DatePeriodTo) 

输出:Table values

Output

enter image description here

+0

等等,我试过chang日期。我的开始日期和结束日期是2016年2月1日,当我运行查询时,它返回了两行。它应该只返回第二行。 –

+0

是的,它会根据查询返回两行,所以你不希望第二行是正确的?你不希望它匹配NULL? – FallAndLearn

+0

自从我的startdate和enddate是2016-02-01开始,它应该只返回第二行,第二行的开始日期是2016-02。 –

1

首先,我认为你换货使用@DatePeriodTo < = ta.EndDate,而不是 '> =' 的。

假设开始日期不能为空,条件应该是:

where ta.StartDate >= @DatePeriodFrom 
and (ta.EndDate is null or ta.EndDate <= @DatePeriodTo) 

一个更值得关注,即使不适用于这种情况下...检查列类型只包含日期或日期和时间... ... 31.12。 2010 10:00 PM> '31 .12.2010'

+0

我想你的意思是'ta.StartDate <= @ DatePeriodFrom'? –

+0

这就是我在回答中写的 – FallAndLearn

+0

这取决于你想要的。我写了一个条件,记录在我的期间内开始和结束的记录。如果你想要整个时期都存在的记录,那就不一样了。如果你想要在时期内有部分活着的记录,那么必须编写另一个记录。告诉我你的情况。 – Divisadero

1

再次:

案例A) 我想这是“活”在整个周期中的记录:

where ta.StartDate <= @DatePeriodFrom 
and (ta.EndDate is null or ta.EndDate >= @DatePeriodTo) 

案例B) 我想在此期间创建和结束的记录

where ta.StartDate >= @DatePeriodFrom 
and (ta.EndDate <= @DatePeriodTo) 

案例C) 我想要在我的期间刚刚活着的记录:

where ta.StartDate <= @DatePeriodTo 
and (ta.EndDate is null or ta.EndDate >= @DatePeriodFrom)