想在oracle 10 里执行JOB,每月29日00:10分执行,考虑闰年平年2月.高分求(分不够再加)!!!

wylbob 2007-10-08 01:27:49
现项目有一需求

要在ORACLE 10里设置一定时JOB,在每月的29号00:10分执行,计算该月29日0点到上月29日0点的一些数据.

对于2月份,在润年的2月29日00:10分执行,在平年则在3月1日00:10分执行(为了计算1月29日0点到3月1日0点以前的数据),

(注意,3月1日执行完后,接着在3月29日执行job,以计算3月1日到3月29日0点之间的数据)

其他月份都为29日00:10分执行.

用last_day + 天数的方法设置会不会有问题?

请给出创建JOB的代码,谢谢.

...全文
448 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
多壮志 2007-10-09
  • 打赏
  • 举报
回复
考虑用别的方式,为什么不设置为每天晚上执行了,然后在过程中判断是否特定的时间?
不要把判断时间的任务交给JOB,而是交给JOB对应的过程中.
凤影 2007-10-08
  • 打赏
  • 举报
回复
其实楼主的日期就是每月的28号+1天。


普通月份不用说了。

普通2月,+1天就是3月1号。

润2月,+1天就是2月29号。


每月28号+1天就是上月底+29天。

job如下:

DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'test;'
,next_date => to_date('29-10-2007 01:00:00','dd/mm/yyyy hh24:mi:ss')
,interval => 'last_day(add_months(TRUNC(SYSDATE,''MM''),-1))+29'
,no_parse => TRUE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/
commit;


解释一下last_day(add_months(TRUNC(SYSDATE,''MM''),-1))+29。
首先取出当前日期(本次执行job的日期)的所在月份TRUNC(SYSDATE,''MM'');
然后取出上月add_months(TRUNC(SYSDATE,''MM''),-1);
然后取出上月月底last_day(add_months(TRUNC(SYSDATE,''MM''),-1));
然后+29天last_day(add_months(TRUNC(SYSDATE,''MM''),-1))+29。
结束,接分。
kinglht 2007-10-08
  • 打赏
  • 举报
回复
关注,firstday+28行不行:
select trunc(to_date('20070202','yyyymmdd'),'mm')+28 from dual;
liuzi123 2007-10-08
  • 打赏
  • 举报
回复
关注下
凤影 2007-10-08
  • 打赏
  • 举报
回复
少了个括号
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'test;'
,next_date => to_date('29-10-2007 01:00:00','dd/mm/yyyy hh24:mi:ss')
,interval => 'decode(TRUNC(SYSDATE,''DD''),to_date(''0301'',''MMDD''),TRUNC(SYSDATE,''MM'')+28,add_months(TRUNC(SYSDATE,''MM''),+1))+28)'
,no_parse => TRUE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/

commit;
凤影 2007-10-08
  • 打赏
  • 举报
回复
楼上说的不错,只顾考虑特殊情况了。修改如下:
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'test;'
,next_date => to_date('29-10-2007 01:00:00','dd/mm/yyyy hh24:mi:ss')
,interval => 'decode(TRUNC(SYSDATE,''DD''),to_date(''0301'',''MMDD''),TRUNC(SYSDATE,''MM'')+28,add_months(TRUNC(SYSDATE,''MM''),+1))+28'
,no_parse => TRUE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/

commit;

就是说如果当前日期是3月1号的话,那么就把下次执行日期设置为本月29号。

如果不是3月1号的话,那么就把日期设为下月1号+28天。
bobfang 2007-10-08
  • 打赏
  • 举报
回复
to fenixshadow,你写的interval好像不对,如果当前是10.29,按你写的interval还是10.29。
to wylbob,实际上可以job设置为每天的0:10运行存储过程,然后在存储过程中判断是否是29日或是平年的3.1,如果是就计算。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧