使用设定值返回日期列表

时间:2016-08-24 16:26:22

标签: plsql oracle11g date-arithmetic

如何从日期中减去几个月,以产生不同的日期?

  1. var date_A = 24-06-2016
  2. var date_B = 24-01-2016
  3. var x = 5
  4. 请问如何使用x(月数)中的值来计算date_B的值,从值date_A?

2 个答案:

答案 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;

您也可以在这些查询中使用绑定变量作为日期或上限。

答案 1 :(得分:0)

如果您想从YES中减去x个月,那就是:

date_A

编辑:亚历克斯击败了我,并有一个新的要求:(