Sql 错误:将表达式转换为数据类型int时出现算术溢出错误
下面的查询返回下面的错误 Msg 8115,16级,状态2,第1行算术溢出错误 正在将表达式转换为数据类型int。警告:空值为 通过聚合或其他集合操作消除 SqlSql 错误:将表达式转换为数据类型int时出现算术溢出错误,sql,sql-server,Sql,Sql Server,下面的查询返回下面的错误 Msg 8115,16级,状态2,第1行算术溢出错误 正在将表达式转换为数据类型int。警告:空值为 通过聚合或其他集合操作消除 Sql SELECT Brands.BrandName AS [Brand], Outlets.OutletName AS [Outlet], AVG(DATEDIFF(ms, Orders.OrderDate, ReceivedOrders.ReceivingDate)) / 60000 AS [Receive], AVG(
SELECT
Brands.BrandName AS [Brand],
Outlets.OutletName AS [Outlet],
AVG(DATEDIFF(ms, Orders.OrderDate, ReceivedOrders.ReceivingDate)) / 60000 AS [Receive],
AVG(DATEDIFF(ms, ReceivedOrders.ReceivingDate, ReadyOrders.ReadyDate)) / 60000 AS [Ready],
AVG(DATEDIFF(ms, ReadyOrders.ReadyDate, DispatchedOrders.DispatchedDate)) / 60000 AS [Dispatch],
AVG(DATEDIFF(ms, DispatchedOrders.DispatchedDate, ClosedOrders.ClosingDate)) / 60000 AS [Close]
FROM dbo.Orders
INNER JOIN dbo.Outlets
ON dbo.Orders.OutletID = dbo.Outlets.OutletID
INNER JOIN dbo.Brands
ON dbo.Brands.BrandID = dbo.Outlets.BrandID
INNER JOIN dbo.ReceivedOrders
ON dbo.Orders.OrderID = dbo.ReceivedOrders.OrderID
LEFT JOIN dbo.ReadyOrders
ON dbo.Orders.OrderID = dbo.ReadyOrders.OrderID
LEFT JOIN dbo.DispatchedOrders
ON dbo.Orders.OrderID = dbo.DispatchedOrders.OrderID
LEFT JOIN dbo.ClosedOrders
ON dbo.Orders.OrderID = dbo.ClosedOrders.OrderID
WHERE Orders.OrderDate BETWEEN '2017-04-1' AND '2017-05-10'
AND ((dbo.Brands.BrandName IS NULL
OR dbo.Brands.BrandName LIKE '%' + '' + '%')
AND (dbo.Outlets.OutletName IS NULL
OR dbo.Outlets.OutletName LIKE '%' + '' + '%'))
GROUP BY Brands.BrandName,
dbo.Outlets.OutletName
ORDER BY dbo.Outlets.OutletName, Brands.BrandName
两个日期之间有很多毫秒的时间间隔——然后进行除法——这意味着SQL需要进行转换——显然,随着日期的增加,它会溢出它试图转换的整数类型 所以,你得到的是两个日期之间的毫秒差,然后除以60000得到分钟。为什么不在几分钟内开始呢?通过这种方式,这种溢出的可能性要低得多 而不是:
AVG(DATEDIFF(ms, Orders.OrderDate, ReceivedOrders.ReceivingDate)) / 60000 AS [Receive]
做:
我认为毫秒的最大值大约是25天的差值:所以你可以改为秒并相应地除以
AVG(DATEDIFF(s, Orders.OrderDate, ReceivedOrders.ReceivingDate)/60.0) AS [Receive],
AVG(DATEDIFF(s, ReceivedOrders.ReceivingDate, ReadyOrders.ReadyDate)/60.0) AS [Ready],
AVG(DATEDIFF(s, ReadyOrders.ReadyDate, DispatchedOrders.DispatchedDate)/60.0) AS [Dispatch],
AVG(DATEDIFF(s, DispatchedOrders.DispatchedDate, ClosedOrders.ClosingDate)/60.0) AS [Close]
MSDN:
如果返回值超出int的范围(-2147483648到+2147483647),则返回错误。对于毫秒,startdate和enddate之间的最大差值为24天20小时31分钟23.647秒
AVG(DATEDIFF(s, Orders.OrderDate, ReceivedOrders.ReceivingDate)/60.0) AS [Receive],
AVG(DATEDIFF(s, ReceivedOrders.ReceivingDate, ReadyOrders.ReadyDate)/60.0) AS [Ready],
AVG(DATEDIFF(s, ReadyOrders.ReadyDate, DispatchedOrders.DispatchedDate)/60.0) AS [Dispatch],
AVG(DATEDIFF(s, DispatchedOrders.DispatchedDate, ClosedOrders.ClosingDate)/60.0) AS [Close]