2017-05-27 41 views
-2
cast(CAST(countAta AS float) 
/CAST(DATEDIFF(day,@searchDate,@EndDate) AS float) as decimal(16,2) 
    ) 
+0

' = 0 then <0 or null> else end'的情况怎么样? – Utsav

回答

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 
+0

这里应该放置别名这样生产效率::: cast(CAST(countAta AS float)/ CAST(DATEDIFF(day,@ searchDate,@ EndDate)AS float)作为十进制(16,2))作为生产力 – vishu

+0

在查询结束。 以生产力结束 –

-1

您可以使用NULLIF来避免被零错误分开。 当分母等于0

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 
+0

我想要1当datadiff为零 – vishu

+0

为什么downvote?任何意见? – TriV

+0

@vishu使用'ISNULL'很容易。而我在您的问题中没有看到这个要求... – TriV

1

您可以通过查询之前设置以下参数避免这种情况,它应该工作得很好,它返回NULL。 123/0

重要的一点是,一旦你用这样的操作进行设置这些属性回ON

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF 

,当你做这样的事情这将返回一个NULL。当你在你的存储过程中有复杂的查询时,这一点特别有用,并且你不想写更多的CASE语句来处理这种情况。

希望这有助于!

+0

一个投票从我这里是有用的,我刚刚了解这些功能。 – Coder1991

0

最好的方法是NULLIF()。 。 。但你不能把值恢复成0

select CAST(CAST(countAta AS float)/
      NULLIF(DATEDIFF(day, @searchDate, @EndDate), 0 
       ) as decimal(16, 2) 
      ) 

这将返回NULL如果分母为0。请注意,您不必转换为浮动两次。