Oracle-如何每年/每月/每周重复查询

时间:2019-04-02 20:03:53

标签: oracle date plsql

我进行了查询,以从日期为2018年12月的所选列中获取行:

(uint8_t)~0U

这很简单,我现在可以使用这些行来创建其他逻辑。但是,如果我需要在给定年份的每个月甚至每周重复一次该怎么办?

我要将查询结果导出到单独的excel表中,所以我想我每次都必须手动检查正确的日期间隔,并且无法汇总整个年/月/等数据。是否没有某种PL / SQL方法可以避免这种乏味的重复?

2 个答案:

答案 0 :(得分:2)

假设您从2018年12月开始一天,您的目标是通过表MyTable2中的数据填充表MyTable

首先,让我们创建没有数据的MyTable2

create table MyTable2 as
select myColumn1, myColumn2 
  from MyTable
 where 1 = 9;

然后创建一个过程,通过该过程在每个月的最后一天填充MyTable2

create or replace procedure pr_populate_Mytable2 is
begin
   insert into MyTable2
   select myColumn1, myColumn2 
     from MyTable
    where to_char(myColumn_DATE, 'YYYY/MM') = to_char(sysdate,'YYYY/MM');
 commit;
end;

通过从dbms_scheduler调用过程为

declare
    v_job_name varchar2(32) := 'jb_populate_Mytable2';
begin  
    dbms_scheduler.create_job(
        job_name => v_job_name,
        job_type => 'STORED_PROCEDURE',
        job_action => 'pr_populate_Mytable2', 
        start_date => to_date('31-12-2018 20:00:00', 'dd-mm-yyyy hh24:mi:ss'),
        repeat_interval => 'FREQ=MONTHLY; BYMONTHDAY=-1; BYHOUR=21;',
        auto_drop => false,
        comments => 'Populates our table on the last day of every month at 21 o''clock ');

    dbms_scheduler.enable(v_job_name);    
end;

从12月最后一天的晚上8点开始,并在未来每个月的最后几天的晚上9点重复。

答案 1 :(得分:1)

您可以使用CONNECT BY LEVEL <=技巧生成行,然后使用日期函数组合来生成相关日期。

--Months for the current year.
select add_months(trunc(sysdate, 'year'), level-1) the_month
from dual
connect by level <= 12;

THE_MONTH
---------
2019-01-01
2019-02-01
2019-03-01
2019-04-01
2019-05-01
2019-06-01
2019-07-01
2019-08-01
2019-09-01
2019-10-01
2019-11-01
2019-12-01

然后使用该查询创建一个内联视图,并将其连接到主表:

select *
from
(
    --Months for the current year.
    select add_months(trunc(sysdate, 'year'), level-1) the_month
    from dual
    connect by level <= 12
) months
left join mytable
    on months.the_month = trunc(mycolumn_date, 'month');