Как я могу использовать SQL BETWEEN для сравнения двух дат в строке для выполнения с sp_executesql? - PullRequest
1 голос
/ 27 марта 2012

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

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 в строку.

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

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

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Вы можете использовать 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 голосов
/ 27 марта 2012

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

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

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

...