T-SQL - получить дату по динамическим параметрам - PullRequest
0 голосов
/ 03 октября 2011

Я пытался определить динамический запрос для получения даты в течение последних 20 дней. Идея довольно проста, и, кроме того, я знаю, что таблица содержит даты от getdate () до -20 дней, но результат все равно не возвращается

DECLARE @date_past_period varchar(MAX);
DECLARE @date_past_number varchar(MAX);
SET @date_past_period='day';
SET @date_past_number='20';

DECLARE @aDate datetime;

DECLARE @sql varchar(MAX);
SET @sql='SELECT date FROM table WHERE convert(varchar,date,121) BETWEEN convert(varchar,getdate(),121) AND convert(varchar,dateadd('+@date_past_period+', -'+@date_past_number+', getdate()),121)';


exec(@sql);

Возможно, проблема в динамике, но я не уверен.

Любой полезный комментарий приветствуется

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

Вы можете использовать функцию CASE (T-SQL):

CREATE PROCEDURE MyStoredProcedure 
@IntervalType VARCHAR(15),
@Num INT
AS

DECLARE @StartDate DATETIME = GETDATE();
DECLARE @EndDate DATETIME = 
    CASE @IntervalType
        WHEN 'DAY' THEN DATEADD(DAY,@Num,@StartDate)
        WHEN 'MONTH' THEN DATEADD(MONTH,@Num,@StartDate)
        WHEN 'YEAR' THEN DATEADD(YEAR,@Num,@StartDate)
    END;

IF @EndDate IS NULL
    RAISERROR('Invalid params', 16, 1);
ELSE
    SELECT date FROM table WHERE date BETWEEN @StartDate AND @EndDate;

При преобразовании в VARCHAR условие поиска из WHERE не будет SARG ( 1 & 2 ).

1 голос
/ 03 октября 2011

Я почти уверен, что этот сценарий может быть реализован без использования динамического SQL, однако одна очевидная проблема в вашем SQL - это предложение before - диапазон находится в неправильном порядке. Попробуйте изменить @sql, как показано ниже:

SET @sql='SELECT date FROM table WHERE convert(varchar,date,121) BETWEEN convert(varchar,dateadd('+@date_past_period+', -'+@date_past_number+', getdate()),121) AND convert(varchar,getdate(),121)';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...