Хранимая процедура для разделения данных за один год по месяцам - PullRequest
0 голосов
/ 23 мая 2018

Я относительно новичок в Oracle, поэтому я очень признателен за некоторую помощь.

У меня есть запрос типа:

SELECT * FROM reservations WHERE date between (date1) and (date2).

Мне нужно получить все бронирования в пределахинтервал: сегодняшняя дата и сегодняшняя дата -1 год, поэтому в основном 1 год истории.

Я хочу выполнить вышеуказанный запрос с интервалом в 1 месяц и экспортировать набор запросов в Excel.Мне нужна некоторая помощь в логике цикла (создание хранимой процедуры или функции), как я буду думать позже для экспорта, чтобы преуспеть.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018
Here is the procedure to create the queries month-wise starting from sysdate . 

create or replace procedure monthwise_query 
as
t_date DATE := TRUNC(SYSDATE) ;
c_date DATE ;
BEGIN

FOR i in 1..12
LOOP
c_date := t_date;

  dbms_output.put_line('select * from reservations where rev_date between to_date('''||c_date||''',''DD-MON-YY'') and (select add_months(to_date('''||c_date||''',''DD-MON-YY''),-1) from dual);');

 select add_months(c_date,-1)  
 into t_date
 from dual;

END LOOP;
END;

- It can be extended with UTIL_FILE utility inside this procedure to write each query result to single/multiple files.

- SPOOL from SQL*plus for each query will be easy

- UNIX script to loop through each monthwise-query to load to file also possible 
0 голосов
/ 23 мая 2018

Это даст все записи от 1 года до сегодняшнего дня:

SELECT * FROM reservations 
WHERE date >= trunc( sysdate ) - interval '1' year
  AND date < trunc( sysdate ) + interval '1' day

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

Я понимаю, что вы хотите выполнить этот запрос 12 раз, каждый раз в течение другого месячного периода.Если да, то выполните этот запрос 12 раз, изменив параметр X (в пределах SELECT 1 As X FROM dual подзапроса), начиная с 12 до 1 (или от 1 до 12):

SELECT * FROM reservations 
CROSS JOIN (
   SELECT 1 As X FROM dual
) x
WHERE date >= trunc( sysdate ) - x * interval '1' month
  AND date < trunc( sysdate ) + interval '1' day - ( x - 1 ) * interval '1' month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...