2016-08-24 2 views
0

Как я могу вычесть несколько месяцев с даты, чтобы создать другую дату?Возврат списка с использованием заданного значения

  1. вар date_A = 24-06-2016
  2. вар date_B = 24-01-2016
  3. вар х = 5

Пожалуйста, как можно использовать значение х (число месяцев) для вычисления значения для даты_B, со значения date_A?

+0

Я добавил вводное предложение уточнить ваш вопрос, и добавил арифметику даты. –

ответ

0

Вы можете использовать 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; 

Вы также можете использовать переменные связывания для дат или верхнего предела в этих запросах.

+0

Я хочу, чтобы список вернулся, т.е.
24-06-16
24-05-16
24-04-16
24-03-16
24-02-16 –

+0

@ OluAkin - это помогло бы показать ваш ожидаемый результат в estion; на данный момент он говорит, что вам нужна одна дата. Измените свой вопрос, чтобы точно объяснить, что вам нужно. –

+0

Спасибо. Это работает (y) –

0

Если вы хотите вычесть x месяцев от date_A, это:

add_months(date_A, x * -1) 

Edit: Алекс бил меня к нему, и есть новое требование :(

Смежные вопросы