1

Ich habe eine Linie in meiner SQL gespeicherte Prozedur, die wie folgt aussieht (wie gewünscht funktioniert):Wie kann ich SQL BETWEEN verwenden, um zwei Datumsangaben in einer Zeichenfolge zu vergleichen, um sie in sp_executesql auszuführen?

HAVING oh.startdate BETWEEN @startDate AND @endDate 

, jedoch weiter unten habe ich die Zeile:

AND (oh.user IN (@userIDs)) 

Wo @userIDs ist ein Komma getrennte Zeichenfolge von IDs und oh.user ist ein INTEGER, also muss ich tatsächlich die gesamte SQL-Abfrage in eine dynamische Zeichenfolge (@sql) mit allen Parametern setzen in sie verkettet und dann verwenden

sp_executesql @sql 

Alles funktioniert gut, außer die zwischen diesen Zeitpunkten, habe ich ein paar Möglichkeiten ausprobiert und immer Fehler halten oder keine Ergebnisse zurückgegeben, wenn es sein sollte:

HAVING oh.startdate BETWEEN CONVERT(DATETIME, '+LEFT(CONVERT(VARCHAR, @startDate, 120), 10)+', 120) AND CONVERT(DATETIME, '+LEFT(CONVERT(VARCHAR, @endDate, 120), 10)+', 120) 

kehrt nichts.

HAVING oh.startdate '+LEFT(CONVERT(VARCHAR, @startDate, 120), 10)+' AND '+LEFT(CONVERT(VARCHAR, @endDate, 120), 10)+' 

gibt auch nichts zurück.

HAVING oh.startdate BETWEEN ' + @startDate +' AND '+ @endDate +' 

kehrt Fehler DATETIME- auf String konvertieren.

Jede Hilfe wird geschätzt.

Danke, Thomas

+0

können Sie Ihre gesamte Abfrage, einige Beispieldaten und Ihre erwarteten Ergebnisse veröffentlichen? – Taryn

+0

Welchen Typ verwendest du für oh.startdate, @startDate und @endDate? –

+0

und sagen Sie uns, welches Datumsformat verwendet wird. (ex: '21 -jan-20012 'oder '21/01/2012') –

Antwort

3

Sie sp_executesql und die Parameter übergeben können Sie wollen:

SET @sql = 'SELECT blabla FROM Table WHERE Something HAVING oh.startdate BETWEEN @startDate AND @endDate' 
EXEC sp_executesql @sql,N'@startDate DATE, @EndDate DATE',@startDate, @EndDate 
+0

Wow. Ich wusste nicht, dass du das kannst. Vielen Dank! Lief wie am Schnürchen. – tsdexter

+0

@tsdexter - froh, dass es funktioniert hat. – Lamak

0

Try this:

HAVING oh.startdate BETWEEN to_date(@startDate,'dd-MM-yyyy') AND to_date(@endDate,'dd-MM-yyyy') 

und ändern Sie die 'dd-MM-yyyy' um das von Ihnen verwendete Datumsformat anzupassen.

+0

Danke für die Hilfe. Die obige Antwort funktionierte perfekt. – tsdexter