Oracle - Как повторить запрос для каждого года / месяца / недели - PullRequest
1 голос
/ 02 апреля 2019

Я сделал запрос, чтобы получить строки из выбранных мной столбцов с датой 2018 декабря:

SELECT myColumn1, myColumn2 
FROM MyTable
WHERE to_char(myColumn_DATE, 'YYYY/MM') = '2018/12'

Это довольно просто, и теперь я могу использовать эти строки для создания дополнительной логики. Однако, что если мне нужно будет повторять это каждый месяц данного года или даже каждую неделю?

Я экспортирую результаты запроса в отдельные таблицы Excel, поэтому я думаю, что мне придется каждый раз вручную проверять правильные интервалы дат и не могу агрегировать данные за целый год / месяц / и т. Д. Есть ли какой-нибудь подход PL / SQL, чтобы избежать этого утомительного повторения?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Предположим, что вы находитесь в день с декабря 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;

начинается в 8 вечера в последний день декабря и повторяется в последующие дни месяца в 9 вечера в будущем.

1 голос
/ 03 апреля 2019

Вы можете использовать трюк 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...