PL / SQL函数在日期之间返回数据

时间:2015-11-30 11:27:17

标签: function plsql

我在创建函数时遇到了麻烦..

我希望该功能能够找到特定帐户在特定日期的租金。

该函数需要2个参数rentacc(number)和rentdate(varchar2)

create or replace function get_rent(rentacc in number,rentdate in varchar2)
return number
as
atype number :=rentacc
begin
if atype =1 
then
select "RATE" from "RENTCHANGE" where TO_DATE(rentdate, 'YYYY-MM-DD') >= TIME or TO_DATE(rentdate, 'YYYY-MM-DD') <=TIME;
else return -1;
end if;
end get_rent;

这是我的table rentchange

ID         ACOUNT      RATE       TIME     
---------- ---------- ---------- ----------
       123          1        ,58 2013-07-09
       124          1        ,69 2013-09-02
       125          1       1,78 2013-10-07
       126          1        2,7 2013-10-17
select function_name(1,20131010)
from dual;

将返回

function_name
-------------------------  
1,78

如果有人有任何建议我会很感激。 感谢。

2 个答案:

答案 0 :(得分:2)

您的问题很混乱,因为您的示例数据和您的函数使用不同的列名等。

无论如何,这是一个SQL语句,可以帮助您了解如何修改函数中的查询:

with rentchange as (select 123 id, 1 account, .58 rate, to_date('09/07/2013', 'dd/mm/yyyy') time from dual union all
                    select 124 id, 1 account, .69 rate, to_date('02/09/2013', 'dd/mm/yyyy') time from dual union all
                    select 125 id, 1 account, 1.78 rate, to_date('07/10/2013', 'dd/mm/yyyy') time from dual union all
                    select 126 id, 1 account, 2.7 rate, to_date('17/10/2013', 'dd/mm/yyyy') time from dual)
-- end of mimicking the rentchange table with data in it. See SQL below:
select rate
from   (select id,
               account,
               rate,
               time start_time,
               lead(time, 1, sysdate) over (partition by account
                                            order by time) end_time
        from   rentchange)
where  start_time <= to_date('10/10/2013', 'dd/mm/yyyy')
and    end_time > to_date('10/10/2013', 'dd/mm/yyyy');

      RATE
----------
      1.78

这使用lead()分析函数来提取有关下一行日期的信息(或者,如果没有下一行,则使用当前时间),然后为您提供可以在其间查询的日期范围。

答案 1 :(得分:0)

这可能是您所需要的,与之前的帖子相比更加简化了!

create or replace function get_ränta(
p_kontotyp in number,
p_datum in varchar2)
return number
is
v_svar number(5,2);
begin


select ränta into v_svar 
from ränteändring 
where tid = (select max(tid) from ränteändring
             where tid <= to_date(p_datum, 'yyyy,mm,dd')
             and ktyp = p_kontotyp);

return v_svar;
exception
when no_data_found then
return -1;
end;