Oracle DB 函数可显示日期操作

问题描述 投票:0回答:1

我创建了一个 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;`
database oracle function for-loop plsql
1个回答
0
投票

永远不要对已经是日期的值使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.