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.
答案 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变量的值。