【问题标题】:Arithmetic overflow error when converting expression to data type datetime将表达式转换为数据类型日期时间时出现算术溢出错误
【发布时间】:2012-09-26 09:58:15
【问题描述】:

在以下查询中:

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

我有这个错误:

将表达式转换为数据类型日期时间的算术溢出错误

有什么问题?

【问题讨论】:

  • 我编辑了您的问题以使其更清楚。请查看此修改。
  • 01/08/2008 是数学,'01/08/2008' 是日期
  • 你试过用单引号括住日期吗? '01/08/2008''31/09/2012'
  • 一般来说,当您有更多信息要添加时,您应该编辑您现有的问题,而不是打开一个新问题。我已投票关闭other one

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


【解决方案1】:

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)

【讨论】:

  • 与其删除时间(这再次否定任何索引使用),不如MESSAGEINSERTDATE >= '20120801' AND MESSAGEINSERTDATE < '20121001'(即切换到半开放间隔)
  • @Damien_The_Unbeliever - CAST( AS DATE) is sargable
  • 查看执行计划here。尽管使用了CAST( AS DATE),但仍使用索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多