查询以查找表是否在特定时间段内更新

时间:2014-10-13 14:11:16

标签: sql plsql oracle-sqldeveloper

Table1 

Emp_no|| end_date || col2 || Sent date

只要在此表中输入详细信息,此表将发送特定员工的详细信息,并且发送日期列将更新为sysdate。

现在第二次运行时,我必须检查是否是在15天内发送给同一员工的邮件?如果是,那么该行将不会在table1中更新。即我必须比较最新发送日期和sysdate。为此,我正在使用一个功能

create or replace Function last_mail_sent(p_emp_no number,pay_period_end_date date)
return number
is
begin

select trunc(sysdate)-trunc(sent_date)
into
l_days
from table1
where emp_no=p_emp_no
and sent_date=(select max(sent_date) from tabl1
                                where emp_no=p_emp_no
                                and trunc(end_date)=trunc(pay_period_end_date );
exception when no_data_found
then
l_days :=0;
else
when others then
l_days:=-1;
end;


return l_days;
end;
/

我试图在我使用此函数来决定是否插入的包中使用的逻辑是:

l_last_mail_sent := last_mail_sent(pass the parameter by fetching cols from cursor)


if l_last_mail_sent=0 (That is no row is fetched from the function)
or l_last_mail_sent>15
then
insert into Table1 
else
--do not insert

end if;

但上述查询的问题是。例如,如果表今天更新了sent_date列已使用今天的日期更新,那么函数将返回0.是否有更好的逻辑可以形成? P.S:我必须创建一个处理这个的函数,因为它可以重用。

1 个答案:

答案 0 :(得分:0)

select trunc(sysdate) - trunc(max(sent_date))
into l_days
from table1
where emp_no = p_emp_no
  and end_date between trunc(pay_period_end_date) and trunc(pay_period_end_date) + 1 - 1/24/60/60;

(此查询不会引发任何异常,因此您不需要捕获任何内容) 我已经改变了一点条件,所以你可以在end_date上使用索引(如果有的话)

然后

if l_last_mail_sent is null or l_last_mail_sent > 15 then
--insert into Table1 
else
--do not insert
end if;