如何归还下个月开始付款的到期日



我已经构建了这个函数,它必须返回基于该质押id的质押的第一个付款到期日。在我的表格中,每个质押都有一个日期,付款发生在每个月的第一天,从质押日期的下一个月开始。我需要从匿名块中调用它…

这里是函数代码

create or replace function DD_PAYDATE1_SF (
pledge_id dd_payment.idpledge%type)
return  date is 
payment_date  dd_payment.paydate%type;
begin 
select    paydate  into payment_date from dd_payment 
where dd_payment.idpledge = pledge_id;

return payment_date;
end  DD_PAYDATE1_SF;

我尝试了trunc函数,但它似乎返回我所有随后的付款-当我收到这个错误时,调用函数"准确获取返回超过请求的行数"-而我只需要第一个

您需要加入具有质押日期(我猜是pledge)的表,筛选仅在此之后获得付款日期,并使用MIN聚合函数获得第一个日期:

create or replace function dd_paydate1_sf (
  pledge_id dd_payment.idpledge%type)
return  date is 
  payment_date dd_payment.paydate%type;
begin 
  select min(d.paydate)
  into payment_date
  from pledge p
  join dd_payment d on d.idpledge = p.pledge_id
  and d.paydate > p.pledge_date
  where p.pledge_id = dd_paydate1_sf.pledge_id;
  return payment_date;
end dd_paydate1_sf;
/

SQL小提琴。

虽然这是值得怀疑的,如果连接和过滤器是必要的,因为它们意味着你可以有一个付款之前,你承诺,这真的没有意义;所以你可能会得到相同的效果,只是通过添加MIN()到您的原始查询。

这将不显示新质押(本月收到的)的第一个日期,并将返回null。如果你也想要这些,并且你关于接下来的第一个月的规则总是正确的,你可以忽略付款表,只计算它应该是什么:

create or replace function dd_paydate1_sf (
  pledge_id dd_payment.idpledge%type)
return  date is 
  payment_date dd_payment.paydate%type;
begin 
  select trunc(p.pledge_date, 'MM') + interval '1' month
  into payment_date
  from pledge p
  where p.pledge_id = dd_paydate1_sf.pledge_id;
  return payment_date;
end dd_paydate1_sf;
/

TRUNC(<date>, 'MM')给出该日期所在月份的第一天,然后您可以添加一个以获得下个月的第一天。

SQL小提琴。

这取决于您是想要第一次预期付款日期,还是第一次实际付款的日期,假设dd_payment正在记录已经发生的实际付款。


获取并显示匿名块中的一个值:

declare
    paydate date;
begin
    paydate := dd_paydate1_sf(104);
    dbms_output.put_line(to_char(paydate, 'DD/MM/YYYY'));
end;
/

您必须更改select语句。如果你想要第一个,你可以这样做:

select   paydate  
into     payment_date
from 
       (select paydate 
        from   dd_payment 
        where  dd_payment.idpledge = pledge_id
        order  by paydate)
where    rownum = 1;

最新更新