过去4个季度的数据

问题描述 投票:2回答:4

我想获取过去四季度的数据,包括当前季度。假设我在30-MAR-2019上运行查询然后我想要从01-APR-201831-MAR-2019的数据,如果我在01-apr-2019上运行查询,那么我想要01-JUL-201830-JUN-2019之间的数据

你能帮我一下吗?

sql database oracle
4个回答
0
投票

你可以做:

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;

1
投票

棘手的部分是获得本季度的最后一天。

此解决方案通过从目标日期减去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
/

那里可能有一个更流畅的解决方案,但这是我喝咖啡休息的结束:)


1
投票

这将工作:

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

1
投票

这是动态的:

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;
© www.soinside.com 2019 - 2024. All rights reserved.