Sql 上四季度数据

Sql 上四季度数据,sql,database,oracle,Sql,Database,Oracle,我想获取包括当前季度在内的上4个季度的数据。 假设我在2019年3月30日运行查询,那么我需要从2018年4月1日到2019年3月31日的数据 如果我在2019年4月1日运行查询,那么我需要2018年7月1日至2019年6月30日之间的数据 你能帮我做同样的事情吗你能做: select (trunc(sysdate, 'Q') + interval '3' month) as next_quarter_start, (trunc(sysdate, 'Q') + interval '

我想获取包括当前季度在内的上4个季度的数据。 假设我在2019年3月30日运行查询,那么我需要从2018年4月1日到2019年3月31日的数据 如果我在2019年4月1日运行查询,那么我需要2018年7月1日至2019年6月30日之间的数据

你能帮我做同样的事情吗你能做:

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;
你可以做:

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;
这将有助于:

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
这将有助于:

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

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

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

也许有一个更圆滑的解决方案,但这是我的咖啡休息时间的结束:

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

此解决方案通过从目标日期减去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
/
也许有一个更圆滑的解决方案,但我的咖啡休息时间到此结束:

这是动态的:

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;
这是动态的:

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;

你能不能请我也删除语法错误?以上查询未运行。@OnkarTiwari。没有语法错误。这是在我发布之前测试过的,下面是证据:。@GordonLinoff-实际上发布的代码中有一个错误。我将间隔“1天”更正为间隔“1天”。不客气-没有得到想要的结果。我得去取第一季度的第一天和第四季度的最后一天。如果我今天运行查询,那么当前季度的最后一天是2019年6月30日,前三个季度的第一天是2018年7月1日……我们必须选择包括当前季度在内的四个季度的数据quarter@OnkarTiwari . . . 只需通过添加更多的月份来更改结束日期。您能让我同时删除语法错误吗?以上查询未运行。@OnkarTiwari。没有语法错误。这是在我发布之前测试过的,下面是证据:。@GordonLinoff-实际上发布的代码中有一个错误。我将间隔“1天”更正为间隔“1天”。不客气-没有得到想要的结果。我得去取第一季度的第一天和第四季度的最后一天。如果我今天运行查询,那么当前季度的最后一天是2019年6月30日,前三个季度的第一天是2018年7月1日……我们必须选择包括当前季度在内的四个季度的数据quarter@OnkarTiwari . . . 只需通过添加更多的月份来更改结束日期。它给出了5个季度的结果……假设我今天运行查询2019年4月16日,那么结果应该是2018年7月1日到2019年6月30日。如果我在2019年3月30日运行,那么结果应该是2018年4月1日至2019年3月31日。它给出了5个季度的结果……假设我在2019年4月16日运行查询,那么结果应该是2018年7月1日至2019年6月30日。如果我在2019年3月30日跑步,那么结果应该是2018年4月1日至2019年3月31日。