job執行時間?
JOB的interval直接用sysdate指定,如: sysdate + 5/1440,oracle自動生成的下一次的執行時間,會有幾秒的延遲.下面是一個測試: 1.創建表test_job_a,用於記錄JOB開始執行時間和結束時間 SQL> create table test_job_a ( 2 start_date date, 3 end_date date ); 2.創建JOB,JOB的首次執行時間指定在11:20:00,interval為5 mins SQL> variable x number; SQL> begin 2 dbms_job.submit ( job => :x, 3 what =>'declare 4 start_date date :=sysdate; 5 begin 6 for i in 1 .. 10 loop 7 dbms_lock.sleep(12); 8 end loop; 9 insert into test_job_a values (start_date, sysdate); 10 commit; 11 end;', 12 next_date => to_date('2010-01-16 11:20:00', 'yyyy-mm-dd hh24:mi:ss'), 13 interval => 'sysdate + 5/1440'); 14 commit; 15* end; 3.時間查看記錄結果: SQL> select * from test_job_a order by start_date;
START_DATE END_DATE ------------------------- ------------------------- 2010-01-16 11:20:02 2010-01-16 11:22:02 2010-01-16 11:25:07 2010-01-16 11:27:07 2010-01-16 11:30:12 2010-01-16 11:32:12 2010-01-16 11:35:17 2010-01-16 11:37:17 2010-01-16 11:40:22 2010-01-16 11:42:22 2010-01-16 11:45:27 2010-01-16 11:47:27 2010-01-16 11:50:32 2010-01-16 11:52:32 2010-01-16 11:55:37 2010-01-16 11:57:37 4.原因: (1) JOB的調用有時間延遲. (2) 根據實際的執行時間來自動計算下一次的執行時間. 如:start_date : 2010-01-16 11:55:37,JOB執行結束後,可以通過查詢user_jobs視圖的next_date列到JOB的下次執行時間: 2010-01-16 12:00:37 SQL> select next_date from user_jobs;
NEXT_DATE ------------------- 2010-01-16 12:00:37 解決方法: 用trunc(sysdate, 'mi') + 5/1440指定時間間隔 把test_job_a表的內容清空,修改上面JOB的interval,再次記錄JOB的執行時間. 記錄結果如下: SQL> select * from test_job_a order by start_date;
START_DATE END_DATE ------------------------- ------------------------- 2010-01-16 14:00:04 2010-01-16 14:02:04 2010-01-16 14:05:04 2010-01-16 14:07:04 2010-01-16 14:10:04 2010-01-16 14:12:04 2010-01-16 14:15:04 2010-01-16 14:17:04 SQL> select next_date from user_jobs;
NEXT_DATE ------------------- 2010-01-16 14:10:00 SQL> /
NEXT_DATE ------------------- 2010-01-16 14:15:00
JOB interval寫法總結: 1day = 24hour= 1440mins 若JOB的執行時間間隔為分鐘: trunc(sysdate,'mi') + n/1444 (0<n<60) 如每隔5mins執行一次: trunc(sysdate,'mi') + 5/1440 若JOB的執行時間間隔為小時: trunc(sysdate, 'hh') + n/24[ + m/1440] (0<n<24, 0<m<60) 如每隔2小時,且執行時間為15mins執行一次: trunc(sysdate, 'hh') + 2/24 + 15/1440 若JOB的執行時間間隔為天: trunc(sysdate) + n [+ m/24 [+ x/1440]] 如每天的8點15執行: trunc(sysdate) + 1 + 8/24 + 15/1440 其他情況就需要用到日期函數了: 1) 如每月5號的8點執行JOB: trunc(last_day(sysdate)) + 5 + 8/24 2) 如週一到週五的8點執行: trunc(least(next_day(sysdate,2), next_day(sysdate,3), next_day(sysdate,4), next_day(sysdate,5), next_day(sysdate,6) )) + 8/24 在oracle中1:代表周 一,2-7依次代表週二…週六 ,(编辑:核心网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |