2017-08-31 2 views
2

gleich und zwischen Klauseln gleichzeitig verwenden Ich habe einige Daten in SQL Server gespeichert, die Daten enthält (date Datentypen). Ich verwende derzeit eine BETWEEN Klausel meine Datensätze zu filtern Reisedaten reichen, so etwas wie diese ...Kann ich in SQL Server

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

Ist es möglich, BETWEEN und LIKE Klausel zur gleichen Zeit zu verwenden, oder etwas in der Nähe, dass so, dass, wenn ein Benutzer gibt keine Daten an, die er/sie alle Berichte ziehen könnte? Bis jetzt die Abfrage unter

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

zeigt überhaupt keine Datensätze. Gibt es eine Möglichkeit, das zu tun ..?

+0

Wird der Benutzer immer präsentieren beide oder n-Parameter, oder könnten sie nur einen einreichen? – scsimon

+0

Sie können Datensätze entweder durch Verwendung von Datumsangaben filtern oder alle Datensätze ohne Angabe von Daten abrufen – Inno

Antwort

7

Verwenden NULL mit einem Parameter ..., wenn kein Wert für @startDate und @endDate angegeben sein, wird der Standard NULL für diese Parameter sein, und die zweite WHERE Bedingung erfüllt sein würde, alle Datensätze zurück.

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) 

Auch, wenn Ihr Feld ein DATETIME ist dann this blog by Aaron is well worth your read.

bedeutet auch, diese Methode der Benutzer beide oder keiner der Parameter eingeben muss. Wenn Sie das nicht möchten, lassen Sie es uns wissen.

+0

Leicht vom Thema entfernt ... Aber die Verwendung optionaler Parameter (... ODER @Parameter IS NULL) Wird das Optimierungsprogramm veranlassen, selbst einen Scan zu wählen wenn Parameter geliefert werden und ein geeigneter Index existiert. Durch Hinzufügen von OPTION (RECOMPILE) zur Abfrage kann der Optimierer die Parameterwerte vor dem Erstellen des Plans einbinden und eine Suche ausführen. Hier ist ein guter Artikel von Gail Shaw: https://www.red-gate.com/simple-talk/sql/t-sql-programming/how-to-confuse-the-sql-server-query-optimizer/ –

+1

Das ist sehr wahr und ein guter Weg, Parameter-Sniffing zu vermeiden, aber ich führe dieses Thema normalerweise nicht so früh ein. – scsimon

+0

Ja, deshalb habe ich es mit "etwas abseits vom Thema" eingeleitet ... Es ist nur eines dieser Dinge, die herausspringen. Gute Aufforderung zum Hinzufügen des Aaron Bertrand Artikels über die Verwendung von BETWEEN mit Daten BTW. –

0

ich glaube, die richtige Logik wäre:

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

, wenn nur einer der Werte NULL ist.

Hinweis:

ich mit Aaron Bertrandsche Beratung gehen würde und wirklich nutzen:

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