2017-08-31 128 views
2

我有一些數據存儲在SQL Server中,它包含日期(date數據類型)。我目前使用BETWEEN子句來篩選我的記錄日期範圍,這樣的事情...我可以在SQL Server中同時使用like和between子句嗎

SELECT 
    * 
FROM 
    Report 
WHERE 
    ReportDate BETWEEN '2016-08-01' AND '2017-08-01' 

是否有可能使用BETWEEN,並在同一時間LIKE條款或東西接近,這樣每當用戶沒有指定他/她能夠提取所有報告的日期?到目前爲止,查詢如下

SELECT 
    * 
FROM 
    Report 
WHERE 
    ReportDate BETWEEN '' AND '' 

根本不顯示任何記錄。有沒有辦法做到這一點..?

+0

使用者會始終存在兩個或N參數,或者可能他們只能提交一個? – scsimon

+0

他們可以使用日期篩選記錄,也可以不指定日期來提取所有記錄 – Inno

回答

7

使用NULL與參數...如果沒有給定值的@startDate@endDate那麼默認將NULL這些參數,而第二WHERE條件將得到滿足,返回的所有記錄。

create proc myProc(@startDate datetime = null, @endDate datetime = null) 
as 

    SELECT * FROM Report 
    WHERE 
    (ReportDate BETWEEN @startDate AND @endDate) 
    or 
    (@startDate is null and @endDate is null) 

此外,如果字段是DATETIME然後this blog by Aaron is well worth your read.

此外,這種方法意味着用戶必須輸入或兩者都不參數。如果這不是你想要的只是讓我們知道。

+0

稍微偏離主題......但使用可選參數(... OR @Parameter IS NULL)將導致優化器選擇掃描,甚至當提供參數並且存在合適的索引時。將OPTION(RECOMPILE)添加到查詢中,允許優化器在創建計劃之前插入參數值,從而允許它執行查找。這是Gail Shaw的一篇很好的文章:https://www.red-gate.com/simple-talk/sql/t-sql-programming/how-to-confuse-the-sql-server-query-optimizer/ –

+1

這就是非常真實,避免參數嗅探的好方法,但我通常不會那麼早就介紹該主題。 – scsimon

+0

是的,這就是爲什麼我在前面加上「稍微偏離主題」的原因......這只是其中一個跳出來的東西。請加上Aaron Bertrand關於使用BETWEEN和BTW日期的文章。 –

0

我認爲正確的邏輯應該是:

SELECT r.* 
FROM Report r 
WHERE (ReportDate >= @startDate OR @startDate IS NULL) AND 
     (ReportDate <= @endDate OR @endDate IS NULL); 

這工作時,只有一個值是NULL

注:

我會去與阿龍貝特朗的建議,真用:

SELECT r.* 
FROM Report r 
WHERE (ReportDate >= @startDate OR @startDate IS NULL) AND 
     (ReportDate < DATEADD(day, 1, @endDate) OR @endDate IS NULL); 
相關問題