算术溢出错误不同将表达式转换为数据类型int

时间:2013-08-22 08:56:55

标签: sql-server

SELECT SUM(
  CASE WHEN RESTORE_TIMESTAMP IS NOT NULL THEN DATEDIFF(MI,SHUTDOWN_TIMESTAMP,RESTORE_TIMESTAMP)
  ELSE DATEDIFF(MI,SHUTDOWN_TIMESTAMP,GETDATE()) END )
   AS downtime
  FROM TX_QUAD_STATUS NOLOCK

我收到了这个错误。

Arithmetic overflow error converting expression to data type int.

3 个答案:

答案 0 :(得分:3)

SUM根据输入值将其结果转换为适当的数据类型。所以你可以通过对更大的类型运行总和来解决这个问题:

SELECT SUM(
          CONVERT(
             bigint,
             DATEDIFF(minute,SHUTDOWN_TIMESTAMP,COALESCE(RESTORE_TIMESTAMP,GETDATE()))
          )
       )AS downtime
FROM TX_QUAD_STATUS NOLOCK

如果bigint不起作用,您可以尝试decimal(38,0)

(正如我对您的问题的评论中提到的,我也用COALESCE替换了整个CASE表达式)

答案 1 :(得分:2)

那么,很可能这些行的总和是巨大的。您可以尝试转换为bigint,但我怀疑如果您放弃总和,您会得到足够的想法,只需看看各个值:

SELECT 
  CASE WHEN RESTORE_TIMESTAMP IS NOT NULL THEN DATEDIFF(MI,SHUTDOWN_TIMESTAMP,RESTORE_TIMESTAMP)
  ELSE DATEDIFF(MI,SHUTDOWN_TIMESTAMP,GETDATE()) END
   AS downtime
  FROM TX_QUAD_STATUS NOLOCK

可以让您了解所涉及的数字。现在把它们加起来 - 如果它们超过20亿:问题。

答案 2 :(得分:1)

获得的结果大于可以保存INT变量的值。