Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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中如何处理被零除错误_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

sql中如何处理被零除错误

sql中如何处理被零除错误,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) 您可以通过在查询之前设置以下参数

您可以使用以避免偏差为零的错误。 当分母等于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(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)
           )