Sql 如何返回从下个月开始的付款到期日

Sql 如何返回从下个月开始的付款到期日,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我已经建立了这个函数,必须根据该质押id返回质押的第一个付款到期日。我的表中有每个质押的日期,付款发生在每个月的第一天,从质押日期的下一个月开始。我需要从匿名块调用它…希望足够清楚 这是函数代码 create or replace function DD_PAYDATE1_SF ( pledge_id dd_payment.idpledge%type) return date is payment_date dd_payment.paydate%type; begin sele

我已经建立了这个函数,必须根据该质押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函数,但在调用函数“exact fetch返回的行数超过请求的行数”时,当我收到此错误时,它似乎会返回所有后续付款- 而我只需要第一个
我该如何解决它呢?您必须更改select语句。 如果您想要第一个,可以执行以下操作:

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

您需要加入到具有质押日期的表中(我猜是
质押
),过滤以仅获取该日期之后的付款日期,然后使用
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;
/

虽然加入和筛选是否必要是值得怀疑的,因为它们暗示你可以在你保证之前得到一笔付款,这是没有意义的;因此,只需将
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(,'MM')
为您提供该日期所在月份的第一天,然后您可以添加一天以获得下个月的第一天

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


要在匿名块中获取并显示一个值,请执行以下操作:

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

dd_付款
表可以包含一个
质押id
的过去和未来付款数量;还有另一张表,上面有
质押id
质押日期
(我会冒险去猜它叫
质押
)?您希望第一个付款日期在质押日期之后,还是下一个付款日期在今天之后?@AlexPoole我需要质押日期之后的第一个付款日期当我从SQL语句调用它时,从DD_paydate中选择DD_paydate 1_SF(104);对于相同的值,我得到了40行输出,为什么那个家伙?…事实上,我需要从匿名块调用它,这是因为你传递了一个固定值作为参数。如果在select语句中使用DD_PAYDATE1_SF函数,那么肯定会将表的列作为该函数的参数传递,而不是固定值。。。类似于:
从表t中选择DD\u paydate 1\u SF(t.credit\u id)
我只是不明白为什么我得到了40行重复值输出…我得到了2012年11月1日的值,这是第一个付款到期日的值,但我得到了40行???@user239635-你如何调用该函数?您每次通话只能返回一个结果,因此您是否在执行类似于从质押中选择dd_paydate1_sf(质押id)的操作?表中的每条记录都应该有一行,尽管日期可能不同。这是我的声明从质押中选择dd_paydate1_sf(104),其中104是质押id@user2396035-AND
质押
大概有40行。您正在从表中选择每一行(因为没有
where
子句),并为相同的值调用函数。您可以从dual中选择dd\U paydate1\u sf(104)或从质押中选择dd\U paydate1\u sf(质押id),其中质押id=104,两者都将得到一个结果。你说你要从匿名块调用它?