2011-10-03 53 views
0

我试图找出动态查询以在过去20天内获取日期列。这个想法很简单,而且,我知道该表确实包含从GETDATE时间()-20天,但还是没有结果得到返回T-SQL - 通过动态参数获取日期

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('[email protected]_past_period+', -'[email protected]_past_number+', getdate()),121)'; 


exec(@sql); 

也许问题出在动态的东西,但我不知道。

任何有用的注释表示赞赏

+3

不确定为什么你不使用存储过程并绕过'exec'。 – JonH

+0

这是一个测试片段。而数据库日期列包含保存的值格式,如“02 Oct 2008 11:02:07:577”传入参数预计采用不同的格式,如“yyyy-mm-dd hh:mm:ss.mmm”,所以我试图使这种方式的通用格式。当然,我不确定这是一个最佳方式,所以如果你可以建议一个更好的,请这样做:) – user592704

+0

SQL Server 2008?还是更早? – gbn

回答

1

我敢肯定,这种情况下可以不使用动态SQL覆盖,但是,在你的SQL一个明显的问题是条款之间 - 的范围是在错误的顺序。尝试如下更改@sql:

SET @sql='SELECT date FROM table WHERE convert(varchar,date,121) BETWEEN convert(varchar,dateadd('[email protected]_past_period+', -'[email protected]_past_number+', getdate()),121) AND convert(varchar,getdate(),121)'; 
+0

不,它不能是非动态的,因为dateadd函数中的像日/周/月等参数必须是可变的:)或者也许有更好的方法来做到这一点? – user592704

+0

哦,太棒了!订单问题是:)它现在工作,但仍然在考虑优化。是否可以,我试图以这种方式将所有常用日期格式? – user592704

+0

@ user592704:如果您的答案已解决,请考虑将其视为已接受。 – daniloquio

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不会特别行政区政府(1 & 2 )。

+0

+ 1为优化帮助:) – user592704

+0

+1在我看来,这是更好的答案,因为它可以防止SQL注入,而其他答案不会。 –