данные за последние 4 квартала - PullRequest
2 голосов
/ 16 апреля 2019

Я хочу получить данные за последние 4 квартала, включая текущий квартал. Предположим, что если я выполню запрос на 30-MAR-2019, то мне нужны данные от 01-APR-2018 до 31-MAR-2019 и если я запускаю запрос на 01-apr-2019, тогда я хочу данные между 01-JUL-2018 и 30-JUN-2019

Не могли бы вы помочь мне в том же

Ответы [ 4 ]

1 голос
/ 16 апреля 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;
1 голос
/ 16 апреля 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
1 голос
/ 16 апреля 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
/

Там может быть более подходящее решение, ноэто конец моего перерыва на кофе:)

0 голосов
/ 16 апреля 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...