T-SQL - 通过动态参数获取日期

时间:2011-10-03 18:40:44

标签: sql-server sql-server-2005 tsql

我试图找出一个动态查询来获取过去20天内的日期col。这个想法非常简单,而且,我知道该表确实包含从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 个答案:

答案 0 :(得分:3)

您可以使用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 :(得分:1)

我很确定可以在不使用动态SQL的情况下覆盖这种情况,但是,SQL中的一个明显问题是between子句 - 范围的顺序错误。尝试更改@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)';