sql中如何处理被零除错误
您可以使用以避免偏差为零的错误。 当分母等于0时,它返回NULLsql中如何处理被零除错误,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,您可以使用以避免偏差为零的错误。 当分母等于0时,它返回NULL cast(CAST(countAta AS float) / CAST(DATEDIFF(day,@searchDate,@EndDate) AS float) as decimal(16,2) ) 或在 CAST(countAta AS decimal(16,2)) /ISNULL(NULLIF(DATEDIFF(day,@searchDate,@EndDate),0), 1) 您可以通过在查询之前设置以下参数
cast(CAST(countAta AS float)
/ CAST(DATEDIFF(day,@searchDate,@EndDate) AS float) as decimal(16,2)
)
或在
CAST(countAta AS decimal(16,2)) /ISNULL(NULLIF(DATEDIFF(day,@searchDate,@EndDate),0), 1)
您可以通过在查询之前设置以下参数来避免这种情况,它应该可以正常工作
CAST(countAta AS decimal(16,2)) /
CASE WHEN DATEDIFF(day,@searchDate,@EndDate) = 0 THEN 1
ELSE DATEDIFF(day,@searchDate,@EndDate)
END
这样做时,将返回一个NULL
:123/0
重要的一点是在完成这些操作后,将这些属性设置回ON。当您的存储过程中有复杂的查询,并且您不想编写越来越多的
CASE
语句来处理这种情况时,这尤其有用。您应该始终使用TRY-CATCH块并使用SQL提供的内置错误处理函数。另外,你可以用另一种方式处理它--
最好的方法是
NULLIF()
。但不能将该值转换回0
:
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
如果分母为0,则返回
NULL
。请注意,您不必对浮点进行两次强制转换。当=0时,case-when=0,然后else-end?当datadiff为zero@vishu使用ISNULL
很容易。我在你的问题中看不到这个要求…别名Productivity应该放在哪里,像这样::cast(cast(countAta作为float)/cast(DATEDIFF(day,@searchDate,@EndDate作为float)作为十进制(16,2))作为Productivity在查询的最后。结束为生产力我投了一票,因为这很有用,我现在刚刚了解了这些功能。字面上说,这是暂时的要求,所以我保存了我。谢谢@SwatiNavalkar,不客气
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
select CAST(CAST(countAta AS float) /
NULLIF(DATEDIFF(day, @searchDate, @EndDate), 0
) as decimal(16, 2)
)