我进行了查询,以从日期为2018年12月的所选列中获取行:
(uint8_t)~0U
这很简单,我现在可以使用这些行来创建其他逻辑。但是,如果我需要在给定年份的每个月甚至每周重复一次该怎么办?
我要将查询结果导出到单独的excel表中,所以我想我每次都必须手动检查正确的日期间隔,并且无法汇总整个年/月/等数据。是否没有某种PL / SQL方法可以避免这种乏味的重复?
答案 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');