使用 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_EffectiveDate
和Policy_ExpiryDate
是同一日期时,除法将是0
。显然有至少一行是这样的。
@Larnu @DaveSmith 好吧,似乎有些行 Policy_EffectiveDate
和 Policy_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 时遇到除以零错误的主要内容,如果未能解决你的问题,请参考以下文章