我创建了一个 PL SQL 函数来根据数据库中存储的不同时期的费率计算金额,该函数应该迭代给定月份并获取每个月的费率并对所有月份进行计算并获取总金额结果整个月。 不幸的是,当在不同的计算机上以不同的数据格式运行时,该函数会显示不同的结果。我可能错过了逻辑中月份的计算吗?
这是 PL/SQL 函数,用于根据数据库中存储的不同汇率计算金额,声明该函数及其接受的金额
例如,在此函数中,提交日期是今天 2024 年 7 月 12 日,月份是 7,它应该在循环中迭代 7 个月,但在某些情况下它会迭代 7 个月,其他情况是 6 个月,其他情况是 4 个月。我会缺少什么逻辑?请帮忙
``FUNCTION of_calc_function(ad_submissiondate IN DATE, as_type IN VARCHAR, as_group IN VARCHAR, an_months IN NUMBER,an_tax IN NUMBER,
an_result OUT NUMBER, as_message OUT VARCHAR) 返回号码是`
根据请求提交日期和迭代所需的月份声明计算所需的变量
ld_date DATE;
ld_maxdate DATE;
ln_rate NUMBER(10,4);
ln_pn NUMBER(30,2);
ln_pn_supprt NUMBER(30,2);
ln_amount NUMBER(30,2);
ln_spoint NUMBER(30,2);
ls_message VARCHAR2(4000);
ld_pn_sdate DATE;
ln_totval NUMBER(38,18);
ln_totval_support NUMBER(38,18);
ln_months NUMBER;
ld_datesub DATE;
BEGIN
ln_pn := 0;
ln_totval := 0;
ln_totval_support := 0;
ln_amount := an_tax;
ln_months := an_months;
ld_datesub :=trunc(to_date(ad_submissiondate,'dd/mm/yyyy'));
--Minus the month acceptance from the function to get the start date to start penalty calculation ld_pn_sdate:=trunc(to_date(ADD_MONTHS(ld_datesub,-ln_months),'dd/mm/yyyy'));
The following block is to select the maximim valid date from rate table and specific rates, then Iterates from the current month to the last valid date to get the amount
SELECT TRUNC(MAX(Fromdate))
INTO ld_maxdate
FROM RATES_TABLE
WHERE type=as_type and group =as_group;
----
FOR li_index IN 1 .. ln_months
LOOP
ld_date :=to_date(ADD_MONTHS(ld_pn_sdate, li_index), 'dd/mm/yyyy'); ---start compute penalty from next month after startdate
--get rates for the dates
IF TO_DATE(ld_date, 'dd/mm/yyyy') >=TO_DATE(ld_maxdate, 'dd/mm/yyyy') THEN
SELECT tr, lsp
INTO ln_rate, ln_spoint
FROM RATES_TABLE
WHERE TO_DATE(Fromdate, 'dd/mm/yyyy') = TO_DATE(ld_maxdate, 'dd/mm/yyyy')
AND type=as_type and group =as_group;
ELSE
SELECT tr, lsp
INTO ln_rate, ln_spoint
FROM RATES_TABLE
WHERE TO_DATE(Fromdate, 'dd/mm/yyyy') <= TO_DATE(ld_date, 'dd/mm/yyyy') AND TRUNC(VALIDTO) >= TO_DATE(ld_date, 'dd/mm/yyyy')
AND type=as_type AND group =as_group;
END IF;
ln_pn_supprt := ln_spoint;
ln_pn := ln_amount*ln_rate*0.01;
ln_totval:=ln_totval+ln_pn;
ln_totval_support:=ln_totval_support+ln_pn_supprt;
END LOOP;
-- Pick the highest value of the two The higher of ln_totval and ln_totval_support
IF ln_totval < ln_totval_support THEN
ln_totval := ln_totval_support;
END IF;
an_result := ln_totval;
END of_calc_function;`
永远不要对已经是日期的值使用
TO_DATE
。
ld_datesub :=trunc(to_date(ad_submissiondate,'dd/mm/yyyy'));
假设
ad_submissiondate
因其是 DATE
数据类型而被命名为:
ld_datesub :=trunc(ad_submissiondate);
同样:
WHERE TO_DATE(Fromdate, 'dd/mm/yyyy') <= TO_DATE(ld_date, 'dd/mm/yyyy')
应该是:
WHERE TRUNC(Fromdate) <= TRUNC(ld_date)
和
TRUNC(VALIDTO) >= TO_DATE(ld_date, 'dd/mm/yyyy')
应该是:
TRUNC(VALIDTO) >= TRUNC(ld_date)