2012-01-11 50 views
1

我有一個存儲過程,它返回報表中使用的數據。用戶可以指定許多參數,其中兩個參數是開始日期和結束日期。我可以使用WHERE create_date BETWEEN @arg_start AND @arg_end語句來篩選日期。t-sql條件日期處理

我不知道該怎麼做是爲了處理用戶不提供任何日期的情況。 CASE不支持任何類似WHERE create_date = CASE @arg_start WHEN NULL THEN create_date ELSE BETWEEN @arg_start AND @arg_end

我已經做了大量的谷歌,MSDN的研究,在這裏,我還沒有找到處理條件空日期時間處理。儘管我知道它的不好的形式,但我可以通過編程的方式傳遞一個神奇的日期,例如1/1/1900,來測試而不是null,但這對於有條件的日期處理沒有任何幫助。

回答

2

我會做的默認值的存儲過程的參數「神奇日期」:

CREATE PROC usp_report 
    @StartDate datetime = '1900-01-01', 
    @EndDate datetime = '9999-12-31' 

AS 

SELECT * 
FROM MyTable 
WHERE DateField BETWEEN @Startdate AND @EndDate 

在應用程序中,如果用戶沒有指定日期,不要將該參數傳遞給存儲過程。

這將保持您的應用程序代碼清潔,併爲您提供所需的數據。

+0

非常感謝大家迴應! – user542319 2012-01-11 19:33:54

3

使它成爲一個多部分條件:

WHERE 
    (@argstart IS NULL AND @argend IS NULL) 
OR (@argend IS NULL AND create_date > @Argstart) 
OR (@argstart IS NULL AND create_date < @argend) 
OR (Createdate BETWEEN @Argstart AND @Argend) 
+0

+1這是我認爲的最佳答案;而Mikael的答案更加優雅,[這樣構造'WHERE'子句實際上是有益的](http://www.sommarskog.se/dyn-search-2005.html#AND_ISNOTNULL)。 – 2012-01-11 18:52:31

+0

@MichaelFredrickson - 很好的信息,我沒有意識到這一點。 – JNK 2012-01-11 18:53:42

3

事情是這樣的:

where (create_date >= @arg_start or @arg_start is null) and 
     (create_date <= @arg_end or @arg_end is null) 

如果你是SQL Server 2008上,你應該使用OPTION (RECOMPILE)。 Ref:Dynamic Search Conditions in T-SQL Version for SQL 2008 (SP1 CU5 and later)

否則,您可能會更好使用JNK提供的answer

+0

+1 - 比我的解決方案更優雅,但我認爲你會得到相同的結果。 – JNK 2012-01-11 18:49:11

+0

@JNK - 一些「閱讀」表明,根據SQL Server版本,我們的答案可能是最好的。顯然,'OPTION(RECOMPILE)'在SQL Server 2005中可用,但在這種情況下不起作用。 – 2012-01-11 19:03:21

+1

他們都給出了正確的答案,這是我認爲的重要部分。 – JNK 2012-01-11 19:05:50