[英]Oracle - How to repeat query for every year/month/week
我已经进行了一个查询,以获取我所选列的日期为2018年12月的行:
SELECT myColumn1, myColumn2
FROM MyTable
WHERE to_char(myColumn_DATE, 'YYYY/MM') = '2018/12'
这很简单,我现在可以使用这些行来创建一些进一步的逻辑。 但是,如果我需要在给定的一年,甚至每个星期每个月重复一次呢?
我将查询结果导出到单独的excel表中,所以我想我必须每次都手动检查正确的日期间隔,并且不能聚合整年/月/等的数据。 是不是有一些PL / SQL方法来避免这种繁琐的重复?
假设你是从2018十二月一日,你的目的是为了填充表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点开始,并在将来的每个月的最后几天重复播放。
您可以使用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');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.