Найти записи в интервале дат в sp_execute sql выражении в SQL - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужна помощь в создании @query, где я получаю записи о дате только в течение заранее определенного интервала. Мой полный запрос здесь не показан, так как остальная часть запроса работает нормально. Я только хочу получить записи данных, которые находятся в пределах определенного временного интервала.

Мой временной интервал структурирован по FirstOfMonth и EndOfMonth для каждого месяца и года, что означает, что данные выглядят так иформат установлен на дату:

enter image description here

Я хочу выбрать данные, попадающие в предопределенный интервал, заданный @DateStart и @DateEnd. Поскольку запрос также должен вызывать имена столбцов, я решил использовать этот метод. В моем старом запросе я использовал показанное предложение WHERE AS. Я хочу перехватить все записи, которые попадают в число первого месяца в выбранном @DateStart и последнего месяца в выбранном @DateEnd.

Когда я пытаюсь объявить переменные как datetime, я получаю сообщение об ошибке, в котором говорится, что я не могу использовать и NVARCHAR(MAX), и (Datetime) в одном и том же @query. Правильно ли это понято?

BEGIN
DECLARE 
    ,@DateStart AS NVARCHAR(MAX)
    ,@DateEnd AS NVARCHAR(MAX)
--  , + 4 Multiple Dynamically Declared 

SET @DateStart = '2016-03-23'
SET @DateEnd ='2019-01-31'

set @query = 
    '
    SELECT 
        * -- 4 Dynamically Declared Variables Here
        ,StartOfMonth
        ,EndOfMonth
    FROM TestData
        WHERE StartOfMonth >= DATEADD(DAY,1,EOMONTH(' + @DateStart + ',-1))
        AND EndOfMonth <= EOMONTH(' + @DateEnd + ')
    '
EXEC sp_executesql @Query
END

1 Ответ

2 голосов
/ 07 ноября 2019

Я не понимаю, почему вы используете динамический SQL. Вы можете устранить эту сложность и просто выполнить параметризованный запрос. Примерно так.

SELECT 
    * -- Multiple Declared Text Variables Here
    ,StartOfMonth
    ,EndOfMonth
FROM TestData
WHERE StartOfMonth >= DATEADD(DAY,1,EOMONTH(@DateStart,-1))
    AND EndOfMonth <= EOMONTH(@DateEnd)

Или, если по какой-то причине, которая не ясна из того, что вы опубликовали, вам действительно нужен динамический sql, вы должны его параметризовать. Это закончилось бы чем-то вроде этого.

set @query = 
    N'
    SELECT 
        * -- Multiple Declared Text Variables Here
        ,StartOfMonth
        ,EndOfMonth
    FROM TestData
        WHERE StartOfMonth >= DATEADD(DAY,1,EOMONTH(@Date_Start,-1))
        AND EndOfMonth <= EOMONTH(@Date_End)
    '
EXEC sp_executesql @Query, N'@Date_Start date, @Date_End date', @Date_Start = @DateStart, @Date_End = @DateEnd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...