2014-03-04 39 views
1
SELECT SchoolID 
FROM ParameterDetails 
INNER JOIN 
EstablishmentParameterValues AS v 
ON v.ParameterID = ParameterDetailID 
WHERE NameResourceKey = 'NonTeachingStaffStartTime' 
AND DATEDIFF(mi, CONVERT (DATETIME, (CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE()), 110) + ' ' + v.ParameterValue)), GETDATE()) <= 60 

上面的查詢提供了錯誤Where子句給出錯誤:「將nvarchar數據類型轉換爲日期時間數據類型導致超出範圍值。」

The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value

當我使用寫

DATEDIFF(mi, CONVERT (DATETIME, (CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE()), 110) + ' ' + v.ParameterValue)), GETDATE()) <= 60 

在SELECT子句中它不給錯誤,那麼它爲什麼給錯誤WHERE子句中..

V.ParameterValues表包含以下類型的值: -

8:45 
8:45 
08:40:00 
08:30:00 
8:45 
+0

你能說什麼是v.ParameterValue值? –

+0

如果'ParameterValue'中的其他值與時間不相似(可能是NonTeachingStaffStartTime以外的其他值),那麼您可能註定要注意,直到將其分成兩個單獨的查詢爲止。無法保證「WHERE」子句參數的評估順序如何,即使您將部分內容移入子查詢中,總是有[SQL Server不應該引發不合邏輯的錯誤](https://connect.microsoft.com/SQLServer/feedback/details/537419/sql-server-should-not-raise-illogical-錯誤)通知您,該策略不會保護您。 –

+0

以下幫助,還是你仍然看到一個問題? –

回答

0

看起來你有一個錯位的括號......並且T-SQL消息與你的數據無關。嘗試改變:
CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE()), 110),以
CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE(), 110))
從而使110是括號內。

如果這樣不能解決您的問題,您可以嘗試添加TOP 1(如SELECT TOP 1...)以確認您的基本代碼工作正常(至少在第一行)。

你也可以檢查不與當前的邏輯正確轉換值:使用ISDATE功能,其中「Returns 1 if the expression is a valid date, time, or datetime value; otherwise, 0」:
WHERE ISDATE(CONVERT(DATE,GETDATE(),110) + ' ' + v.ParameterValue) = 0

希望幫助...

相關問題