2013-03-28 110 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)+ '' '' + .....