Ausgabe
Ich habe folgende Tabelle und möchte die Auswahl mit der DATE_FORM
Variable steuern.
Warum funktioniert mein T-SQL-Code nicht? Hat jemand eine Idee?
-- @DATE_FORM = 1 select a particular INFO-DATE INTERVALL
-- @DATE_FORM = 2 select a particular ORDER-DATE INTERVALL
-- @DATE_FORM = 3 select a particular SHIPPING INTERVALL
DECLARE @DATE_FORM int = 3,
@FROM smalldatetime = '2022-10-05 00:00:00',
@UNTIL smalldatetime = '2022-10-06 00:00:00';
SELECT *
FROM [AdventureWorksDW2019].[dbo].[Table_2]
WHERE 1 = 1
AND (CASE WHEN @DATE_FORM = 1 THEN INFO_DATE
WHEN @DATE_FORM = 2 THEN ORDER_DATE END) BETWEEN @FROM AND @UNTIL
AND ((CASE WHEN @DATE_FORM = 3 THEN SHIPPING_DATE_START END) BETWEEN @FROM AND @UNTIL
AND (CASE WHEN @DATE_FORM = 3 THEN SHIPPING_DATE_END END) BETWEEN @FROM AND @UNTIL)
Lösung
Es funktioniert nicht, weil Ihre Fälle es nicht zulassen, dass Ihre Bedingungen jemals erfüllt werden. Nehmen wir zum Beispiel an @Date_Form = 3
, was passiert mit dieser Bedingung?:
(CASE WHEN @DATE_FORM = 1 THEN INFO_DATE
WHEN @DATE_FORM = 2 THEN ORDER_DATE
END) between @FROM and @UNTIL
Da @DATE_FORM = 3
in nicht behandelt Case
wird, würde dies im Wesentlichen zu Folgendem führen:
null between @From AND @UNTIL
was zu false führen wird. Ich würde (der Einfachheit halber) die Fälle vollständig entfernen:
SELECT *
FROM [AdventureWorksDW2019].[dbo].[Table_2]
WHERE (@DATE_FORM = 1
AND INFO_DATE BETWEEN @FROM AND @UNTIL)
OR (@DATE_FORM = 2
AND ORDER_DATE BETWEEN @FROM AND @UNTIL)
OR (@DATE_FORM = 3
AND SHIPPING_DATE_START BETWEEN @FROM AND @UNTIL
AND SHIPPING_DATE_END BETWEEN @FROM AND @UNTIL)
Beantwortet von – Soerman
Antwort geprüft von – Terry (FixError Volunteer)