2:00-8:00中间隔半小时执行一次 case when在定时任务中没写过,不知道行不行,你自己测试下吧 VARIABLE jobno number;↙ begin DBMS_JOB.SUBMIT(:jobno, '你定时执行的存储过程;', sysdate, 'case when to_char(sysdate,'hh24')>='08' then trunc(sysdate)+1+2/24 when to_char(sysdate,'hh24')<'02' then trunc(sysdate)+2/24 else sysdate+1/24/2 end'); commit; end;
上面引号缺失,修正下 VARIABLE jobno number;↙ begin DBMS_JOB.SUBMIT(:jobno, '你定时执行的存储过程;', sysdate, 'case when to_char(sysdate,''hh24'')>=''08'' then trunc(sysdate)+1+2/24 when to_char(sysdate,''hh24'')<''02'' then trunc(sysdate)+2/24 else sysdate+1/24/2 end'); commit; end;
VARIABLE jobno number;↙
begin
DBMS_JOB.SUBMIT(:jobno,
'你定时执行的存储过程;',
TO_DATE(
TO_CHAR(SYSDATE,'YYYYMMDD')||
LPAD(TRUNC(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
,'YYYYMMDDHH24'),
'sysdate+0.25');
commit;
end;
case when在定时任务中没写过,不知道行不行,你自己测试下吧
VARIABLE jobno number;↙
begin
DBMS_JOB.SUBMIT(:jobno,
'你定时执行的存储过程;',
sysdate,
'case when to_char(sysdate,'hh24')>='08' then
trunc(sysdate)+1+2/24
when to_char(sysdate,'hh24')<'02' then
trunc(sysdate)+2/24
else
sysdate+1/24/2
end');
commit;
end;
VARIABLE jobno number;↙
begin
DBMS_JOB.SUBMIT(:jobno,
'你定时执行的存储过程;',
sysdate,
'case when to_char(sysdate,''hh24'')>=''08'' then
trunc(sysdate)+1+2/24
when to_char(sysdate,''hh24'')<''02'' then
trunc(sysdate)+2/24
else
sysdate+1/24/2
end');
commit;
end;
我觉得这段代码改成这样可能会更好
VARIABLE jobno number;↙
begin
DBMS_JOB.SUBMIT(:jobno,
'你定时执行的存储过程;',
TO_DATE(
TO_CHAR(SYSDATE,'YYYYMMDD')||
LPAD(CEIL(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
,'YYYYMMDDHH24'),
'sysdate+0.25');
commit;
也就是说把四舍五入改成向上取整,应为6点以后比如当前时间是7点,下次的执行时间应该是12点,如果四舍五入的话还是6点,可能就有问题
我觉得这段代码改成这样可能会更好
VARIABLE jobno number;↙
begin
DBMS_JOB.SUBMIT(:jobno,
'你定时执行的存储过程;',
TO_DATE(
TO_CHAR(SYSDATE,'YYYYMMDD')||
LPAD(CEIL(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
,'YYYYMMDDHH24'),
'sysdate+0.25');
commit;
也就是说把四舍五入改成向上取整,应为6点以后比如当前时间是7点,下次的执行时间应该是12点,如果四舍五入的话还是6点,可能就有问题
这么写有问题,如果当前是19点,获取的就是24点,小时的取值范围应该是0-23,to_date就会报错了
我那个没啥问题,第一次运行的时间是“第三个参数的时间然后再加上0.25天之后的时间”,你可以去测试下,没啥问题的,这个写法我自己用过的
创建任务之后可以通过上面语句查看任务下次执行的时间,你自己去测试下吧
VARIABLE jobno number;↙
begin
DBMS_JOB.SUBMIT(:jobno,
'你定时执行的存储过程;',
TO_DATE(
TO_CHAR(SYSDATE,'YYYYMMDD')||
LPAD(TRUNC(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
,'YYYYMMDDHH24'),
'TO_DATE(
TO_CHAR(SYSDATE,''YYYYMMDD'')||
LPAD(TRUNC(TO_NUMBER(TO_CHAR(SYSDATE,''HH24''))/6)*6,2,''0'')
,''YYYYMMDDHH24'')+0.25');
commit;
end;
我想请教您一个问题关于next_time和interval的,自动任务第一次执行时间是取得next_time的值吧,在自动任务的存储过程执行的开始就算出了下次执行的时间,这个时间应该是用interval它算出来的吧,现在的问题是下次运行的时间是用interval它算出来,还是用next_time和interval这两个一块作用算出来的。或者您可以给我讲一下自动任务执行的顺序,先谢谢您了
只在每天的6:00,12:00,18:00,24:00这四个时间点执行
Interval => trunc(sysdate,'hh') + 1/24
然后在要调用的存储过程里判断是不是 6:00,12:00,18:00,24:00就行了.
这样的话如果需求该了,改成4:00,8:00,12:00了,还的在改一次存储过程,不利于维护
存储过程相对还是比较好维护的了.因为有些job的时间段不好用interval去做,所以也是可以考虑这种方法的.
当然能用interval是最好.呵