2012-09-26 79 views
0

時在下面的查詢:算術溢出錯誤將表達式轉換爲數據類型日期時間

SELECT 
    DU.MESSAGEINSERTDATE 
from [MYSMSREPORT].[DBO].[SIXDAYSHISTORY] 
where 
    (CONVERT(NVARCHAR, CONVERT(DATETIME, MESSAGEINSERTDATE, 104), 112) 
    BETWEEN 
    CONVERT(NVARCHAR, CONVERT(DATETIME, 01/08/2008, 104), 112) 
    AND CONVERT(NVARCHAR,CONVERT(DATETIME,31/09/2012,104),112)) 

我有這樣的錯誤:

Arithmetic overflow error converting expression to data type datetime

問題是什麼?

+0

我編輯你的問題更明確排除時間。請查看此編輯。 –

+0

2008年1月8日是數學,'01/08/2008'是日期 –

+1

您是否在日期周圍試過單引號? ''01/08/2008''和''31/09/2012'' – Taryn

回答

2

9月31日不是日期,所以SQL無法將其轉換爲一個日期。

順便說一句,您應該以文化非特定格式(yyyyMMdd)硬編碼日期。 01/08/2012可能會在您的服務器上轉換爲8月1日,但在另一個上運行,可能會在1月8日。 20120801將轉換爲8月1日全部機器。

另外爲什麼要將日期轉換爲NVARCHAR?您正在移除您擁有的任何指數,並執行不必要的隱式和顯式轉換。假設MESSAGEINSERTDATE是一個DATETIME列,你可以只使用

WHERE MESSAGEINSERTDATE BETWEEN '20120801' AND '20120930' 

如果您需要從MESSAGEINSERTDATE使用

CAST(MESSAGEINSERTDATE AS DATE) 
+0

而不是刪除時間(這再次否定了任何索引使用),最好是'MESSAGE INSERTDATE> ='20120801'和MESSAGE INSERTDATE <'20121001'(即切換到半開放間隔) –

+1

@Damien_The_Unbeliever - 'CAST(AS DATE)'[是sargable ](http://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable) –

+0

檢查執行計劃[此處](http://www.sqlfiddle.com/#!3/56abb/2)。儘管使用「CAST(AS DATE)」,索引仍被使用。 – GarethD

相關問題