1

У меня есть строка в моей SQL хранимую процедуру, которая выглядит следующим образом (работает как намеченная):Как я могу использовать SQL BETWEEN для сравнения двух дат в строке для выполнения sp_executesql?

HAVING oh.startdate BETWEEN @startDate AND @endDate 

Однако дальше у меня есть строка:

AND (oh.user IN (@userIDs)) 

Где @userIDs запятая разграничены строка идентификаторов и oh.user является INTEGER, поэтому я должен фактически поставить весь запрос SQL в динамическую строку (@sql) со всеми параметрами сцепленных в него, а затем использовать

sp_executesql @sql 

Все не работает отлично, кроме между датами, я попробовал несколько способов, и продолжает получать ошибки или нет результатов возвращаются, когда должен быть:

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

возвращает ничего.

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

также ничего не возвращает.

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

возвращает ошибку преобразования DATETIME в строку.

Любая помощь приветствуется.

Спасибо, Томас

+0

можете ли вы опубликовать весь свой запрос, некоторые примеры данных и ожидаемые результаты? – Taryn

+0

Какой тип вы используете для oh.startdate, @startDate и @endDate? –

+0

и сообщите нам, какой формат даты используется. (например: '21 -jan-20012 'или '21/01/2012') –

ответ

3

Вы можете использовать sp_executesql и передавать параметры, которые вы хотите:

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

Ничего себе. Я не знал, что вы можете это сделать. Спасибо! Работал как шарм. – tsdexter

+0

@tsdexter - рад, что он сработал. – Lamak

0

Попробуйте это:

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

и изменить 'ДД-ММ-ГГГГ' чтобы соответствовать формату даты, который вы используете.

+0

Спасибо за помощь. Ответ выше работал отлично. – tsdexter