基于sysdate的前几个季度的数据

时间:2019-05-13 12:52:11

标签: sql oracle plsql database-administration date-arithmetic

我有以下要求。

假设我在15-APR-2019上运行查询,则应该获取4th quarter 2018(01-OCT-18 to 31-DEC-18)的数据。如果我在15-MAY-2019上运行查询,我应该得到1st quarter of 2019(01-JAN-2019 to 31-MAR-2019)的数据。

表示如果季度末数据与当前日期相差30天,那么我应该获得上一季度的数据。但是如果相差少于30天,我应该获取上一季度的数据。

表示

I run on 15-APR-2019 data should be of (01-OCT-2018 to 31-DEC-2018)
I run on 01-APR-2019 data should be of (01-OCT-2018 to 31-DEC-2018)
I run on 01-MAY-2019 data should be of (01-JAN-2019 to 31-MAR-2019)
I run on 01-JUN-2019 data should be of (01-JAN-2019 to 31-MAR-2019)

如何将此标准放在where子句中。我们必须根据sysdate计算数据,并且必须按存储在数据库中的日期进行比较。

2 个答案:

答案 0 :(得分:2)

类似这样的东西:

select trunc(sysdate - 30, 'Q') - interval '3' month

如果您需要完整的数据:

where date >= trunc(sysdate - 30, 'Q') - interval '3' month and
      date < trunc(sysdate - 30, 'Q')

答案 1 :(得分:2)

with s as
(select date '2019-04-15' dt from dual union all
 select date '2019-04-01' dt from dual union all
 select date '2019-05-01' dt from dual union all
 select date '2019-06-01' dt from dual
)
select dt, d1, add_months(d1, 3) - 1 d2
from
   (select dt, add_months(trunc(dt, 'q'), case when dt - trunc(dt, 'q') < 30 then -6 else -3 end) d1
    from s
   );

DT                  D1                  D2                 
------------------- ------------------- -------------------
2019-04-15 00:00:00 2018-10-01 00:00:00 2018-12-31 00:00:00
2019-04-01 00:00:00 2018-10-01 00:00:00 2018-12-31 00:00:00
2019-05-01 00:00:00 2019-01-01 00:00:00 2019-03-31 00:00:00
2019-06-01 00:00:00 2019-01-01 00:00:00 2019-03-31 00:00:00