2013-11-21 89 views
0

我想寫一個條件查詢條件下面的表的日期,有時它需要很好的思考。具有多個日期條件的SQL查詢

StartDtm        StopDtm 
2013-11-03 00:00:00.000    NULL 
2013-11-05 08:00:00.000    NULL 
2013-11-18 09:00:00.000    NULL 
2013-11-18 08:00:00.000    NULL 
2013-11-19 08:00:00.000    2013-11-26 07:59:00.000 
2013-11-20 08:00:00.000    2013-11-27 07:59:00.000 
2013-11-19 08:00:00.000    2013-12-19 07:59:00.000 

該表顯示任務開始日期和任務結束日期。開始日期不能爲空。 最後一條記錄顯示該任務在11月19日開始,並將在12月19日結束。因此,如果我通過任何日期,它應顯示所有需要在通過的日期範圍之間的任何日期執行的任務。

條件如下:

1.任何日期或兩個日期參數可能爲空。如果是的話,所有的數據應該來。

2.如果@StartDtm爲null並且傳遞了@StopDtm,則它應該僅基於StopDtm字段獲取所有數據,但不應帶有其StartDtm大於@StopDtm的數據。同爲@StopDtm參數

3.如果StopDtm字段爲空,它應該帶來基於StartDtm場僅

我試過一些方法,但沒有取得成功的所有數據。我保持儘可能短的條件。如果可能的話,請提供多個查詢,並稍加解釋。

我的查詢如下:

DECLARE @StartDtm datetime='2013-11-15' 
DECLARE @StopDtm datetime='2013-11-21' 

select * from #TempTbl 
where ((StartDtm<[email protected] OR @StartDtm IS NULL) AND (StopDtm>[email protected] OR StopDtm IS NULL)) 
    OR((StartDtm>[email protected] OR @StartDtm IS NULL) AND (StopDtm>[email protected] AND StartDtm<= @StopDtm OR StopDtm IS NULL OR @StopDtm IS NULL)) 
    OR((StartDtm>[email protected] OR @StartDtm IS NULL) AND (StopDtm<[email protected] OR StopDtm IS NULL OR @StopDtm IS NULL)) 

在此先感謝.. 這個問題已經問StackOverflow的,但我怎麼也找不到這裏進行遷移。所以再次問到這裏。

創建另一個查詢,這似乎做工精細:

DECLARE @StartDtm datetime='2013-11-20' 
DECLARE @StopDtm datetime='2013-11-30' 

IF(@StartDtm is null) 
begin 
    SET @StartDtm='1900-01-01' 
end 
IF(@StopDtm IS NULL) 
begin 
    SET @StopDtm='9999-12-31' 
end 

select * from #TempTbl 
where (startDtm<= @StartDtm and ISNULL(StopDtm,@StopDtm)>[email protected]) 
    OR(StartDtm>[email protected] and ISNULL(StopDtm,@StopDtm)<[email protected]) 
    OR(StartDtm between @StartDtm AND @StopDtm and ISNULL(StopDtm,@StopDtm)>[email protected] ) 
    OR(StartDtm<[email protected] AND ISNULL(StopDtm,@StopDtm) between @StartDtm AND @StopDtm) 

建議如果任何邏輯上的錯誤/變更/改進。

回答

0

是否

WHERE (StartDtm <= @StopDtm AND @StopDtm >= @StartDtm) OR (StartDtm >= @StartDtm AND StopDtm IS NULL) 

爲你工作?

+0

是。它應該工作。目的是獲取任務列表。如果賦予StartDtm和StopDtm之間的日期範圍,則OR之前的條件將工作,但如果表中的StopDtm爲空,那麼它只需要在StartDtm上運行,並且應該避免StopDtm條件檢查。 –

0

試試這個

WHERE (@StartDtm IS NULL OR StartDtm = @StartDtm) 
    AND (@StopDtm IS NULL OR StopDtm = @StopDtm) 
    OR (ISNULL(@StartDtm,@StopDtm) = NULL OR (StartDtm> @StartDtm AND StopDtm < @StopDtm)) 
+0

它不工作。檢查它是否存在有問題的日期範圍。爲此,它應該提供所有記錄,但是您的情況不會給出任何記錄。 –

+0

@ChiragFanse我無法理解爲什麼對於給定的參數範圍('2013-11-15',2013-11-21'),查詢應該提供所有記錄。 也許這是很好的描述你的業務領域,而不是你的數據庫環境 –

+0

前四條記錄沒有StopDtm&因此被認爲是無限期結束。因此,即使他們很少有StartDtm <'2013-11-15',它會因爲StopDtm(這是無限的)總會是<'2013-11-21',這意味着這些任務的發生將落在給定範圍內。對於剩餘的3條記錄,任務在15日後開始,但會在21日後結束。因此,在2013-11-15至2013-11-21的日曆中,會發生這些任務。日期列顯示任務從日期X開始,並將繼續發生,直到日期y。如果任何事件發生在範圍內,則應該導致o/p –