动态SQL中的日期过滤

时间:2013-05-08 21:39:13

标签: sql-server datetime

set @vSqlFilters = '(ABRA.START_DATE !> ' + cast(@dEndDate as varchar(26)) + ' or ABRA.END_DATE !< ' + cast(@dStartDate as varchar(26)) + ')';

我希望我的参数@dStartDate和@dEndDate能够保留它们周围的引号。目前,它们由最终用户手动输入并带有引号。现在,我得到了

我的查询中的

(ABRA.START_DATE !> 2013-05-01 or ABRA.END_DATE !< 2011-04-05)代替

(ABRA.START_DATE !> '2013-05-01' or ABRA.END_DATE !< '2011-04-05').

由于这是抛入动态SQL查询,我需要将@dEndDate和@dStartDate转换为字符串。此外,我希望它将我的dStartDate和dEndDate视为日期不是整数。我只是不知道如何让SQL来比较我的日期。

谢谢!

1 个答案:

答案 0 :(得分:1)

在要显示单引号的语句中的任何位置放置双引号单引号:

set @vSqlFilters = '(ABRA.START_DATE !> ''' + cast(@dEndDate as varchar(26))
+ ''' or ABRA.END_DATE !< ''' + cast(@dStartDate as varchar(26)) + ''')';

但是,没有必要这样做。使用sp_executesql,您只需使用参数:

DECLARE @SQL nvarchar(max);
SET @SQL = 'SELECT * FROM dbo.ABRA ABRA WHERE ABRA.START_DATE <= @dEndDate'
+ ' AND ABRA.END_DATE >= @dStartDate';
EXEC sp_executesql @SQL, N'@dStartDate datetime, @dEndDate datetime',
@dStartDate, @dEndDate;

在我看来,这是更好的练习。它还可以通过执行计划重用提供更好的性能(或者可能不会)。

我还建议您不要使用不等运算符!!<!>。它们使其他人难以阅读和理解您的代码。使用<>>=<=

最后,您确定要在过滤器中使用OR吗?我可能会遗漏一些东西。