我想获取过去四季度的数据,包括当前季度。假设我在30-MAR-2019
上运行查询然后我想要从01-APR-2018
到31-MAR-2019
的数据,如果我在01-apr-2019
上运行查询,那么我想要01-JUL-2018
和30-JUN-2019
之间的数据
你能帮我一下吗?
你可以做:
select (trunc(sysdate, 'Q') + interval '3' month) as next_quarter_start,
(trunc(sysdate, 'Q') + interval '15' month) - interval '1' day as next_quarter_end
from dual;
棘手的部分是获得本季度的最后一天。
此解决方案通过从目标日期减去9个月然后使用'Q'
掩码截断来计算范围的开始日期,该掩码为我们提供了该季度的第一天。然后我们再次计算该日期,减去一天然后再增加十二个月,并给出当前季度的最后一天:
with tgt as ( select date '2019-03-30' as dt from dual
union all select date '2019-02-28' as dt from dual
union all select date '2019-04-01' as dt from dual
)
select trunc(tgt.dt - interval '9' month, 'Q') as range_st,
(trunc(tgt.dt - interval '9' month, 'Q') - 1) + interval '12' month as range_end
from tgt
/
那里可能有一个更流畅的解决方案,但这是我喝咖啡休息的结束:)
这将工作:
select TRUNC(sysdate+1, 'Q') - interval '9' month,TRUNC(sysdate+1, 'Q') +
interval '3' month -1
from dual ;
01-JUL-2018 30-JUN-2019
select TRUNC(to_date('30-MAR-2019')+1, 'Q') - interval '9'
month,TRUNC(to_date('30-MAR-2019')+1, 'Q') + interval '3' month -1
from dual ;
01-APR-2018 31-MAR-2019
这是动态的:
With param as (
Select
to_date(extract(year from add_months(sysdate,-12)) ||
lpad((floor(extract(month from add_months(sysdate,-12))/3)*3)+1,2, '0') || '01',
'yyyymmdd') first_date
from dual
)
Select
level quartal,
Add_months(first_date, ((level-1)*3)) from_dat,
Last_day(add_months(first_date, ((level-1)*3)+3)-1) to_dat
From param
connect by level <= 4;