You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Fast Formula中GET_WORKING_DAYS动态传参返回0求助

Oracle Fast Formula薪资按比例计算工作日逻辑除零错误排查与解决

问题背景

我使用Oracle Fast Formula修改薪资元素的按比例计算(prorate)逻辑,原逻辑通过days_between计算自然日(示例:薪资£3100/31天×15天=£1500),客户要求改用周一至周五的工作日计算(示例:£3100/22天×10天=£1409.09)。替换为get_working_days函数后编译通过,但运行时触发除零错误——l_total_days变量返回0;但硬编码固定日期时能正确得到22天,动态使用PAY_EARN_PERIOD_END和PAY_EARN_PERIOD_START参数则无法正常获取工作日数。

相关代码

原自然日计算代码

l_total_days = days_between(PAY_EARN_PERIOD_END, PAY_EARN_PERIOD_START ) + 1
l_days = days_between(prorate_end , prorate_start) + 1
l_value = (l_value / l_total_days) * l_days

修改后工作日计算代码(存在问题)

l_total_days = get_working_days(PAY_EARN_PERIOD_END, PAY_EARN_PERIOD_START )
l_days = days_between(prorate_end , prorate_start)
l_value = (l_value / l_total_days) * l_days

硬编码测试可行代码

/* Debugging: Assign specific dates for March */
l_first_day_of_month = to_date('2026-03-01', 'YYYY-MM-DD')
l_last_day_of_month = to_date('2026-03-31', 'YYYY-MM-DD')

l_total_working_days = GET_WORKING_DAYS(l_first_day_of_month, l_last_day_of_month)
l_days = get_working_days(prorate_start, prorate_end)
l_value = (l_value / l_total_working_days) * l_days

原因分析

  1. 参数顺序错误:get_working_days函数要求第一个参数为起始日期,第二个为结束日期。修改后的代码将PAY_EARN_PERIOD_END(结束日期)放在了第一个参数位置,导致日期范围反转,函数返回0。
  2. 参数有效性未校验:未确认PAY_EARN_PERIOD_START和PAY_EARN_PERIOD_END在运行时是否正确传递,存在空值或日期顺序颠倒的可能。
  3. 逻辑不一致:修改后代码中l_days仍使用days_between计算自然日,与工作日计算的业务要求不匹配。

解决方法

  1. 修正参数顺序:将get_working_days的参数调整为起始日期在前、结束日期在后:
l_total_days = get_working_days(PAY_EARN_PERIOD_START, PAY_EARN_PERIOD_END )
  1. 添加参数有效性校验:避免空值或无效日期导致的异常,可根据业务需求设置错误提示或默认值:
/* 校验薪资周期日期参数有效性 */
if PAY_EARN_PERIOD_START is null or PAY_EARN_PERIOD_END is null then
    raise error('薪资周期日期参数不能为空');
elsif PAY_EARN_PERIOD_START > PAY_EARN_PERIOD_END then
    raise error('薪资周期起始日期不能晚于结束日期');
end if;

l_total_days = get_working_days(PAY_EARN_PERIOD_START, PAY_EARN_PERIOD_END )
l_days = get_working_days(prorate_start, prorate_end)
l_value = (l_value / l_total_days) * l_days
  1. 统一工作日计算逻辑:将l_days也改为使用get_working_days,确保按比例计算的分子分母均为工作日数:
l_days = get_working_days(prorate_start, prorate_end)

内容的提问来源于stack exchange,提问作者Cromwell1485

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:39:55