-1
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.
4

3 回答 3

4

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

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

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

(正如我对你的 Q 的评论中提到的,我也CASE用 a 替换了整个表达式COALESCE

于 2013-08-22T09:04:20.947 回答
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 亿:问题。

于 2013-08-22T09:00:54.503 回答
1

得到的结果大于可以容纳一个 INT 变量的值。

于 2013-08-22T08:59:22.200 回答