使用 datediff 时遇到除以零错误

Posted

技术标签:

【中文标题】使用 datediff 时遇到除以零错误【英文标题】:Divide by zero error encountered when using datediff 【发布时间】:2021-12-10 17:55:54 【问题描述】:

我在使用此查询时收到此错误。有没有办法防止这个错误?

这是错误

遇到除以零错误。

这里是查询:

UPDATE T_SG_WICA_RISK_DETAILS   
SET EarnedPercentage =  case when Policy_ExpiryDate <  (getdate()-1) then '1'
                else datediff(day, Policy_EffectiveDate,(getdate()-1)) /
datediff(day, Policy_EffectiveDate,Policy_ExpiryDate)
                end

【问题讨论】:

请只标记您真正使用的RDBMS。 SQL Server 和 mysql 是完全不同的产品。至于错误,它告诉你问题;你不明白的错误怎么办? 我猜你有一行有效日期和到期日期在同一天,所以除数中的日期差异返回零 @Larnu 知道了。至于错误,我不确定如何解决它,因为除数不应该返回零。我已经查看了其他一些关于此的主题,但我仍然不确定。 正如@DaveSmith 提到的,当Policy_EffectiveDatePolicy_ExpiryDate 是同一日期时,除法将是0。显然有至少一行是这样的。 @Larnu @DaveSmith 好吧,似乎有些行 Policy_EffectiveDatePolicy_ExpiryDate 的日期相同。除数处的 NULLIF 解决了这个问题。谢谢 【参考方案1】:

根据您的要求和架构,您可以将这些值视为NULL

UPDATE T_SG_WICA_RISK_DETAILS   
SET EarnedPercentage = case
  when Policy_ExpiryDate <  (getdate()-1) then '1'
  else datediff(day, Policy_EffectiveDate,(getdate()-1)) /
    NULLIF(datediff(day, Policy_EffectiveDate,Policy_ExpiryDate), 0)
end

注意除数中的NULLIF()。当DATEDIFF 产生值0 时,它将产生NULL,并且由于包含NULL 的算术表达式将产生NULL,因此您的除法最终将是NULL

使用上述方法,如果 NULL 没有用处,则可以使用任何值,方法是将 ELSE 中的整个表达式包装到 ISNULL() 中:

UPDATE T_SG_WICA_RISK_DETAILS   
SET EarnedPercentage = case
  when Policy_ExpiryDate <  (getdate()-1) then '1'
  else ISNULL(datediff(day, Policy_EffectiveDate,(getdate()-1)) /
    NULLIF(datediff(day, Policy_EffectiveDate,Policy_ExpiryDate), 0), 0)
end

【讨论】:

以上是关于使用 datediff 时遇到除以零错误的主要内容,如果未能解决你的问题,请参考以下文章

处理“除以零错误遇到错误”

运行脚本时,我在 SQL 中得到“除以零”

如何避免 SQL 中的“除以零”错误?

如何修复'RuntimeWarning:在 double_scalars 中遇到的除以零'

我不能使用 datediff vba

除以零 - c 编程