2013-03-28 66 views
-1

我在我的店里动态查询procedure.When我添加了一个条件,以检查日期这是给我下面的错误状态之间:从字符串转换日期和/或时间时动态SQL查询与条件之间的日期检查?

转换失败。

这里是我的查询:

@EffDate datetime = GETDATE() 

我的动态查询里面:

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

如何处理这种情况?

+1

为什么不写为''WHERE GETDATE(之间)。 ..'? –

+0

我需要从外部传递该@EffDate,但默认为当前日期。 – user1882705

回答

1

你生产@query值样子(例如):

WHERE 2008-01-01 00:00:00.000 BETWEEN ... 

你需要在你的@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)'; 
3

既然你是串联字符串中的一个DateTime必须将其转换为字符串第一:

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)'; 
+0

如果没有引用字面值,这仍然无效。 –

+0

一如既往,注意SQL注入!此查询看起来很脆弱。 –

+0

@KyleHale There are quoted – Taryn

0

如果@EffDate并不总是GETDATE(),您可以使用CAST:

CAST(@EffDate AS VARCHAR) 

和你的代码应该可以正常工作。你必须把它周围的单引号:

'WHERE @EffDate =' + '' '' + CAST(@EffDate AS VARCHAR)+ '' '' + .....