2016-03-08 148 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)