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

Posted

技术标签:

【中文标题】PL/SQL 函数返回日期之间的数据【英文标题】:PL/SQL Function to return data between dates 【发布时间】:2015-11-30 11:27:17 【问题描述】:

我在创建函数时遇到问题..

我希望该功能可以查找某个帐户在某个日期的租金。

该函数有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;

这是我的桌子租金变化

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

如果有人有任何建议,我将不胜感激。 谢谢。

【问题讨论】:

您确定该功能是列出的功能吗? 不确定我是否关注 【参考方案1】:

您的问题令人困惑,因为您的示例数据和函数使用不同的列名等。

无论如何,这里有一个 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() 分析函数来提取有关下一行日期的信息(或者,如果没有下一行,则使用当前时间),然后为您提供可以查询的日期范围。

【讨论】:

但如果我想在我的表中再插入 100 行,我必须更改我的函数。这不是可选的吗? @ErikRehn 如果您谈论的是我用来生成数据以在 sql 的主要位中运行的rentchange 子查询,那么我希望您意识到您不需要它。由于您没有充分解释您的功能应该做什么以及如何使用它,因此几乎不可能说您是否需要更改它。我认为,如果您只想为一个特定帐户进行选择,那么您可能一开始就没有很好地设计它! 所以你在哪里声明 start 和 stop_time 我会改用我的参数? 嗯,不;这些是查询中的列;它是 to_date('10/10/2013', 'dd/mm/yyyy') 将被参数替换。【参考方案2】:

这可能是你需要的,比以前的帖子更简单!

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;

【讨论】:

哇!非常好。干得好

以上是关于PL/SQL 函数返回日期之间的数据的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:游标使用中的 ORA-01001

如何使用间隔 1 分钟在两个日期之间将时间序列数据生成到 Oracle PL/SQL 中的表中?

如何在 pl/sql 过程中使用游标返回多行和多列?

PL/SQL:函数返回无值

Oracle常用函数

在 PL\SQL 中设置 SYS_REFCURSOR 以返回数据集