cast(CAST(countAta AS float)
/ CAST(DATEDIFF(day,@searchDate,@EndDate) AS float) as decimal(16,2)
)
答案 0 :(得分:1)
您可以通过在查询之前设置以下参数来避免此类情况,它应该可以正常工作。
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
当您执行以下操作时,这将返回NULL
:123 / 0
重要的是,完成此类操作后,请将这些属性设置为ON
。当您在存储过程中遇到复杂查询并且您不希望最终编写越来越多的CASE
语句来处理这种情况时,这尤其有用。
希望这有帮助!!!
答案 1 :(得分:0)
您应该始终使用TRY-CATCH块并使用SQL提供的内置错误处理函数。此外,您可以用另一种方式处理它 -
SELECT CASE
WHEN (CAST(DATEDIFF(Day, @searchDate, @EndDate) AS FLOAT) AS DECIMAL(16, 2)) = 0
THEN NULL -- Ideally it should return NULL but you can change it as per your requirement
ELSE CAST(CAST(Counter AS FLOAT) / CAST(DATEDIFF(Day, @searchDate, @EndDate) AS FLOAT) AS DECIMAL(16, 2))
END
答案 2 :(得分:0)
最好的方法是NULLIF()
。 。 。但是你无法将值转回0
:
select CAST(CAST(countAta AS float) /
NULLIF(DATEDIFF(day, @searchDate, @EndDate), 0
) as decimal(16, 2)
)
如果分母为0,则返回NULL
。请注意,您不必两次转换为浮点数。
答案 3 :(得分:-1)
您可以使用NULLIF来避免零错误。 当分母等于0时,它返回NULL
CAST(countAta AS decimal(16,2)) /ISNULL(NULLIF(DATEDIFF(day,@searchDate,@EndDate),0), 1)
或使用CASE WHEN
CAST(countAta AS decimal(16,2)) /
CASE WHEN DATEDIFF(day,@searchDate,@EndDate) = 0 THEN 1
ELSE DATEDIFF(day,@searchDate,@EndDate)
END