Вы можете использовать the add_months()
function:
select add_months(to_date('24-06-2016', 'DD-MM-YYYY'), -5) from dual;
ADD_MONTHS(TO_DATE('24-06-2016','DD-MM-YYYY'),-6)
-------------------------------------------------
2015-12-24
С помощью SQL * Plus или переменных связывания SQL Developer (не уверен, если это то, что у вас есть), вы можете сделать:
var date_a varchar2(10);
var date_b varchar2(10);
var x number;
exec :date_a := '24-06-2016';
exec :x := 5;
exec :date_b := to_char(add_months(to_date(:date_a, 'DD-MM-YYYY'), -:x), 'DD-MM-YYYY');
print date_b
DATE_B
------
24-01-2016
, если вы хотите, чтобы каждый из в предыдущие пять месяцев и в текущем месяце вы можете использовать манекен hierarchical query:
select add_months(to_date('24-06-2016', 'DD-MM-YYYY'), 1-level)
from dual
connect by level <= 6;
ADD_MONTHS(TO_DATE('24-06-2016','DD-MM-YYYY'),1-LEVEL)
------------------------------------------------------
2016-06-24
2016-05-24
2016-04-24
2016-03-24
2016-02-24
2016-01-24
Или, если вы на самом деле иметь начальную и конечную дату, а не дату окончания и x
, вы можете сделать:
select add_months(to_date('24-06-2016', 'DD-MM-YYYY'), 1-level)
from dual
connect by add_months(to_date('24-06-2016', 'DD-MM-YYYY'), 1-level)
>= to_date('24-01-2016', 'DD-MM-YYYY');
ADD_MONTHS(TO_DATE('24-06-2016','DD-MM-YYYY'),1-LEVEL)
------------------------------------------------------
2016-06-24
2016-05-24
2016-04-24
2016-03-24
2016-02-24
2016-01-24
Или вы могли бы использовать recursive subquery factoring вместо синтаксиса connect by
, если вы хотите, и вы на 11gR2 или выше:
with r (dt) as (
select to_date('24-06-2016', 'DD-MM-YYYY') from dual
union all
select add_months(r.dt, -1) from r
where add_months(r.dt, -1) >= to_date('24-01-2016', 'DD-MM-YYYY')
)
select r.dt
from r
order by r.dt desc;
Вы также можете использовать переменные связывания для дат или верхнего предела в этих запросах.
Я добавил вводное предложение уточнить ваш вопрос, и добавил арифметику даты. –