2013-08-22 47 views
-2
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 

並且出現此錯誤。不同於將算術溢出錯誤轉換爲數據類型的表達式int

Arithmetic overflow error converting expression to data type int. 
+0

噓 - 'COALESCE(RESTORE_TIMESTAMP,GETDATE())'將如果不返回'RESTORE_TIMESTAMP' NULL,否則它將返回GETDATE()的返回值。 –

+0

檢查您的返回類型,以及它返回值的大小和變量 – 2013-08-22 09:07:23

回答

1

獲得的結果大於可容納INT變量的值。

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億:問題。

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)

(正如我在您的問與答評論中提及,我也換成了全CASE表達了COALESCE

相關問題