将表达式转换为数据类型datetime时出现算术溢出错误

时间:2012-09-26 09:58:15

标签: sql sql-server sql-server-2008

在以下查询中:

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))

我有这个错误:

  

将表达式转换为数据类型datetime的算术溢出错误

有什么问题?

1 个答案:

答案 0 :(得分: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)