我试图找出一个动态查询来获取过去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);
也许这个问题在于动态,但我不确定。
赞赏任何有用的评论
答案 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;
答案 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)';