我不确定以下查询导致以下错误的原因:
Msg 8115,Level 16,State 2,Line 2
将表达式转换为数据类型int的算术溢出错误。
查询:
SELECT
(SUM(rLSP.PoundsMade) / (SUM(rLSAh.rpt_Line_Shift_AvailableHrs) - (SUM(cast((PD. [End Time]
- PD.[Start Time]) as float)))))*(SUM(rLSPdt.DownTimeHrs)*(60*60) + SUM(rLSPdt.DownTimeMins)*60)
FROM
rpt_Line_Shift_Prod as rLSP
INNER JOIN
rpt_Line_Shift_AvailableHrs as rLSAh ON rLSAh.LineNumber = rLSP.LineNumber
INNER JOIN
[Production Downtime] as PD ON rLSP.LineNumber = PD.[Line #]
INNER JOIN
rpt_Line_Shift_ProdDownTime as rLSPdt ON rLSPdt.LineNumber = rLSP.LineNumber
GROUP BY
PD.[Line #], rLSP.LineNumber, rLSAh.LineNumber;
如何修复此错误?我使用了相同类型的SUM
语句,其中我将日期时间作为浮点数多次转换,没有错误。
答案 0 :(得分:0)
这很可能是因为用于计算的列使用的数据类型无法保存某些计算结果。
如果你试试这个,你可以轻松地重现这个:
DECLARE @IFlowOver TABLE (ID INT PRIMARY KEY IDENTITY(1,1), Val INT)
INSERT @IFlowOver (Val)
SELECT 2000000000
SELECT Val*Val FROM @IFlowOver
SELECT
会抛出相同的错误,因为无法在int范围内表示2,000,000,000次2,000,000,000次。
为了避免这种情况,您可以CAST
将列SELECT
更宽泛的数据类型进行计算。
我的上述示例BIGINT
例如,如果我仅仅为了计算而转换为SELECT CAST(Val AS BIGINT) * CAST(Val AS BIGINT) FROM @IFlowOver
:
CAST
但如果只有一方是SELECT CAST(Val AS BIGINT) * Val FROM @IFlowOver
{{1}}