Return 使用设定值的日期列表
Return list of date using a set value
如何从日期中减去月数以产生不同的日期?
- var date_A = 24-06-2016
- var date_B = 24-01-2016
- 变量 x = 5
请问如何使用 x(月数)中的值从值 date_A 计算 date_B 的值?
您可以使用 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 开发者绑定变量(不确定你有没有)你可以这样做:
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;
您也可以在这些查询中为日期或上限使用绑定变量。
如果要从 date_A
中减去 x
个月,则为:
add_months(date_A, x * -1)
编辑:Alex 先于我,还有一个新要求:(
如何从日期中减去月数以产生不同的日期?
- var date_A = 24-06-2016
- var date_B = 24-01-2016
- 变量 x = 5
请问如何使用 x(月数)中的值从值 date_A 计算 date_B 的值?
您可以使用 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 开发者绑定变量(不确定你有没有)你可以这样做:
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;
您也可以在这些查询中为日期或上限使用绑定变量。
如果要从 date_A
中减去 x
个月,则为:
add_months(date_A, x * -1)
编辑:Alex 先于我,还有一个新要求:(