2009-11-23 20 views
1

我想在我的查詢中使用SQL的DateAdd函數。問題是,當我用一個參數來設置第二arguement中,的說法,我得到一個錯誤,會說這樣的事情:在查詢的DATEADD函數中使用參數

未能參數值從 一個十進制轉換爲DateTime

雖然如果我輸入它無參數,即硬編碼一個INT,它工作正常。

這工作:

SELECT  FieldOne, DateField 
FROM   Table 
WHERE  (DateField> DATEADD(day, -10, GETDATE())) 

雖然這並不:

SELECT  FieldOne, DateField 
FROM   Table 
WHERE  (DateField> DATEADD(day, @days, GETDATE())) 

其中@days = -10

任何想法成什麼樣,我做錯了什麼?順便提一下,我在SQL Server管理器中設置了這個變量,因爲我正在試圖解決DataAccess代碼中的一個錯誤。不知道這是否有所作爲。

感謝

+0

適用於SQL Server 2008管理工作室。你正在使用哪個SQL服務器。 – Saar

+1

我建議讓我們更接近實際的代碼,而不是這個沒有人能夠發現任何問題的基本版本。 – MartW

回答

3

聽起來像你正在通過decima l由於第3,而不是第二個參數來DATEADD(),如:

DATEADD(day, GETDATE(), @days) 

雖然在問題的片斷看起來很好。

+1

DATEADD()的文檔(以及我使用它的經驗)表明這是不準確的。這是SSIS中的一個錯誤 - 上述代碼在任何SQL版本中都不起作用。 http://technet.microsoft.com/en-us/library/ms186819.aspx – Spikeh

+1

@spikeh上面的代碼突出顯示了包含錯誤的片段。你爲什麼期望它工作? – Andomar

0

下面的代碼工作完全正常位置(SQL Server 2005中,在Management Studio中執行):

DECLARE @days decimal 
SET @days = -10 

SELECT DATEADD(day, @days, GETDATE()) 

一樣以下

DECLARE @days decimal 
SET @days = -10 

SELECT * FROM myTable WHERE myDate > DATEADD(day, @days, GETDATE()) 

所以,這個問題必須躺在其他地方...

0

您確定錯誤與此陳述有關嗎?有沒有涉及小數,如果我嘗試這個它仍然有效

DECLARE @days decimal (19,6) 
SET @days = -10.3346 

--result is actually irrelevant 
IF CAST(40000.6 AS decimal (19,6)) > DATEADD(day, @days, GETDATE()) 
    SELECT 'yes' 
ELSE 
    SELECT 'no' 

即使想投-10十進制爲smalldatetime這給了不同的錯誤

SELECT CAST(CAST(-10 AS decimal (19,6)) AS smalldatetime) 

Msg 8115, Level 16, State 2, Line 1 
Arithmetic overflow error converting expression to data type smalldatetime. 
+0

酷查找出。 :) – Saar

8

我知道這是舊的文章,但對於有此問題的其他人,我在Reporting Services 2008 R2中遇到類似問題,但是錯誤消息是「參數數據類型nvarchar對於dateadd函數的參數2無效」。我認爲這個問題可能是相關的。

問題是由Reporting Services解析SQL代碼以生成報表數據集的方式造成的。就我而言,我能夠改變這個集查詢:

SELECT DateAdd(wk, @NumWeeks, calendar_date) AS ToWeekFromDate 
FROM dim_date 

這樣:

SELECT DateAdd(wk, Convert(Int, @NumWeeks), calendar_date) AS ToWeekFromDate 
FROM dim_date 

和錯誤得到解決。

編輯:只是稍微擴展一下這個答案:問題是Reporting Services無法解析@NumWeeks的正確數據類型,我想可能是因爲它在DateAdd()函數中,並且默認它是NVarchar 。添加明確的Convert()以將數據類型設置爲Int(即使它已經是一個數字)可以使解析器正確識別@NumWeeks的數據類型。