我想寫一個條件查詢條件下面的表的日期,有時它需要很好的思考。具有多個日期條件的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)
建議如果任何邏輯上的錯誤/變更/改進。
是。它應該工作。目的是獲取任務列表。如果賦予StartDtm和StopDtm之間的日期範圍,則OR之前的條件將工作,但如果表中的StopDtm爲空,那麼它只需要在StartDtm上運行,並且應該避免StopDtm條件檢查。 –