У нас есть запрос, как показано ниже
SELECT p.propertyNumber as propertyNumber,
( SELECT COUNT(*)
FROM #TEM
WHERE pNumber = p.propertyNumber
AND dsenderType = 0
AND dType = 1
AND reTime >= '2017-03-01 00:00'
AND reTime <= '2017-04-01 00:00' ) AS temailCount,
( SELECT COUNT(*)
FROM #TEM
WHERE pNumber = p.propertyNumber
AND dsenderType = 1
AND dType = 1
AND dSendStatus = 1
AND sentTime >= '2017-03-01 00:00'
AND sentTime <= '2017-04-01 00:00' ) AS temailJobCount,
( SELECT SUM( DATEDIFF( second, reTime, jEnddate ) )
FROM #TEM
WHERE pNumber = p.propertyNumber
AND dsenderType = 0
AND dType = 1
AND ( jStatus = 2 OR jStatus = 4 )
AND jEnddate >= '2017-03-01 00:00'
AND jEnddate <= '2017-04-01 00:00' ) AS temailturnAroundTime
FROM property p
WHERE p.locationId = 6
GROUP BY propertyNumber
Он выдает ошибку «Арифметическая ошибка переполнения, преобразующая выражение в тип данных int». Но это работает, если мы изменим SUM( DATEDIFF( second, reTime, jEnddate ) )
на SUM( DATEDIFF( minute, reTime, jEnddate ) )
и самое большое число будет 1153447 минут, что не более 70000000 секунд.
Самое странное, что это работает, если мы изменим порядок запросов, поместив функцию SUM
в качестве второго поля, например (также работает, если SUM
является единственным полем)
SELECT p.propertyNumber AS propertyNumber,
( SELECT SUM( DATEDIFF( second, reTime, jEnddate ) )
FROM #TEM
WHERE pNumber = p.propertyNumber
AND dsenderType = 0
AND dType = 1
AND ( jStatus = 2 OR jStatus = 4 )
AND jEnddate >= '2017-03-01 00:00'
AND jEnddate <= '2017-04-01 00:00' ) AS temailturnAroundTime,
( SELECT ......) AS temailCount,
( SELECT ......) AS temailJobCount
FROM property p
WHERE p.locationId = 6
GROUP BY propertyNumber
Мы можем решить проблему, приведя результат DATEDIFF
к bigint
, но я все равно не могу понять, почему возникает ошибка. Может ли кто-нибудь дать мне ключ? Большое спасибо!