2017-08-31 18 views
2

SQL Serverに格納されているデータがあります(日付はdateです)。日付は、このような何かを範囲で私は現在 SQL Serverでlike節とbetween節を同時に使用することができます

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

はそれが可能 BETWEENと同時に LIKE句またはそのように近いものを使用することです...私のレコードをフィルタリングする BETWEEN句を使用していたときにユーザーはすべてのレポートをプルできる日付を指定していませんか?これまでの質問

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

は全くレコードを表示していません。これを行う方法はありますか?値が@startDate@endDateのために与えられていない場合は、パラメータを持つ

+0

ユーザーは常に両方またはn個のパラメータを提示する、またはそれらを一つだけを提出するだろうか? – scsimon

+0

日付を使用してレコードをフィルタリングするか、日付を指定しないことによってすべてのレコードをプルすることができます – Inno

答えて

7

使用NULLは...デフォルトでは、これらのパラメータのNULLとなり、第二WHEREの条件は、すべてのレコードを返し、満たされるでしょう。あなたのフィールドがDATETIMEある場合

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) 

また、その後、this blog by Aaron is well worth your read.

はまた、この方法は、ユーザーが両方またはパラメータのどちらを入力しなければならないことを意味します。それがあなたがほしいと思うものでなければ私達に知らせてください。

+0

トピックを少しオフにします...しかし、オプションのパラメータ(... OR @Parameter IS NULL)を使用すると、オプティマイザはスキャンパラメータが供給され、適切なインデックスが存在する場合。 OPTION(RECOMPILE)を問合せに追加すると、プランを作成する前にオプティマイザがパラメータ値をプラグインし、シークを実行できるようになります。ゲイル・ショウの良い記事は次のとおりです。https://www.red-gate.com/simple-talk/sql/t-sql-programming/how-to-confuse-the-sql-server-query-optimizer/ –

+1

非常に真実で、パラダイムスニッフィングを避ける良い方法ですが、私は通常その主題をとても早く紹介しません。 – scsimon

+0

そうです、そういうわけで、私は「少し話題になった」という言葉で始まりました...それは跳躍するものの1つです。 BOTWEENの使用についてのAaron Bertrandの記事を追加してよろしくお願いします。 –

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); 
関連する問題