Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 错误:将表达式转换为数据类型int时出现算术溢出错误_Sql_Sql Server - Fatal编程技术网

Sql 错误:将表达式转换为数据类型int时出现算术溢出错误

Sql 错误:将表达式转换为数据类型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(

下面的查询返回下面的错误

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(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]