Oracle SQL中的退休日期函数

时间:2017-04-03 14:15:21

标签: sql oracle plsql

我想在使用触发器检索结果之前使用函数计算员工从其首次约会日期退休并将其存储在Retirement日期列中:但我对语法不满意请有人帮忙:...下面是我的功能代码

CREATE OR REPLACE Function EDOR_DATE
(DOFA IN date)
RETURN date
IS
NEW_EDOR_RESULT date;

BEGIN

SELECT DOFA + ((365*35) + 9) as NEW_EDOR
FROM EMPLOYEES_MASTER_DETAILS; 

fetch NEW_EDOR into NEW_EDOR_RESULT;

RETURN  NEW_EDOR_RESULT;

END;

3 个答案:

答案 0 :(得分:1)

首先评论您对该功能所做的更改:

  1. 删除" IN"从声明中实际上什么也没做。  如果您未指定" IN'," OUT"或" IN OUT"编译器默认为" IN"。删除它的所有操作都是从显式声明到隐式声明的更改。
  2. 在指定位置放置分号(;)将生成错误。
  3. 至于功能本身,你会让它变得比必要的复杂。只需要一个简单的任务即可。另外,Boneist建议add_months是添加年份的正确函数,因为它将根据闰年和每月的天数(如果需要)进行调整。

    因此,您的功能会缩减为:

    create or replace function edor_date(dofa in date) 
    return date 
    is
        l_edor_date date; 
    begin
        l_edor_date := add_months(dofa, 35*12) ;
        return  l_edor_date ;
    end;
    

    或甚至更进一步:

    create or replace function edor_date (dofa in date) 
    return date 
    is
    begin
        return  add_months(dofa, 35*12) ;
    end;
    

    BTW:我实际上喜欢使用函数的想法,因为它隐藏了业务规则的实现细节。但是,它确实会给每次通话带来轻微的开销。

答案 1 :(得分:0)

CREATE OR REPLACE Function EDOR_DATE
(DOFA date) 
RETURN date 
IS
NEW_EDOR_RESULT date;

BEGIN
--I am converting this to a case statement that is easier to read
select 
case 
when dofa - dob <= 25 then dofa + ((365*35)+9) 
else dob + ((365*60)+9)
end
into new_edor_result
from employees_master_details;

return new_edor_result;
end;

答案 2 :(得分:0)

这可以在不需要使用功能的情况下完成。另外,为什么要添加天数?一年不是365天。您应该使用add_months()功能。

假设所有相关列都属于EMPLOYEES_MASTER_DETAILS表,我将如何执行此操作:

select emp_id,
       dob,
       hire_date,
       case when months_between(hire_date, dob) <= 25 * 12 then add_months(hire_date, 35*12)
            else add_months(dob, 60*12)
       end retirement_date
from   EMPLOYEES_MASTER_DETAILS emd;

如果需要在插入时计算退出,那么只需将case表达式用作insert语句的一部分。