具有日期检查的中间条件的动态sql查询?

具有日期检查的中间条件的动态sql查询?,sql,Sql,我的存储过程中有一个动态查询。当我添加了一个条件来检查日期是否在条件之间时,它会给我以下错误: 从字符串转换日期和/或时间时,转换失败 我的问题是: @EffDate datetime = GETDATE() 在我的动态查询中: set @query = @query + ' WHERE ' + @EffDate + ' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_En

我的存储过程中有一个动态查询。当我添加了一个条件来检查日期是否在条件之间时,它会给我以下错误:

从字符串转换日期和/或时间时,转换失败

我的问题是:

@EffDate datetime = GETDATE()
在我的动态查询中:

set @query = @query + ' WHERE  ' + @EffDate + ' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)';

如何处理此情况?

由于要在字符串中连接日期时间,必须先将其转换为字符串:

set @query = @query 
  + ' WHERE  ''' 
  + CONVERT(nvarchar(24),@EffDate, 121) 
  + ''' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)';

如果@EffDate并不总是GETDATE(),则可以使用强制转换:

CAST(@EffDate AS VARCHAR)
您的代码应该可以正常工作。您必须在其周围加上单引号:


'其中@EffDate='+'''''+CAST(@EffDate作为VARCHAR)+'''''+..…。

生成的@query值如下所示(例如):

您需要在查询中围绕@EffDate添加引号:

set @query = @query + ' WHERE  ''' + CONVERT(nvarchar(24), @EffDate,121) + ''' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)';

为什么不把它写成
“WHERE GETDATE()介于…
之间?”我需要在外部传递@EffDate,但默认值是当前日期。如果传入的文本周围没有引号,这仍然不起作用。一如既往,请注意SQL注入!这个查询看起来很脆弱。@KyleHale有些引用是在我的评论发布后添加的,但很公平:)
set @query = @query + ' WHERE  ''' + CONVERT(nvarchar(24), @EffDate,121) + ''' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)';
set @query = @query + ' WHERE  ' + quotename(@EffDate,'''') + ' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)';