данные за последние 4 квартала

#sql #database #oracle

#sql #База данных #Oracle

Вопрос:

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

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

Ответ №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
/
 

Возможно, есть более простое решение, но это конец моего перерыва на кофе 🙂

Ответ №2:

это будет работать:

 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. это дает результат 5 квартала …… предположим, что если я выполняю запрос сегодня (16 апреля 2019 года), то результат должен быть с 01 июля 2018 года по 30 июня 2019 года. если я баллотируюсь 30 марта 2019 года, то результат должен быть с 01 апреля 2018 года по 31 марта 2019 года.

Ответ №3:

Это динамически:

 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;
 

Ответ №4:

Вы можете сделать:

 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. не могли бы вы, пожалуйста, также удалить синтаксическую ошибку? приведенный выше запрос не выполняется.

2. @OnkarTiwari . . . Синтаксической ошибки нет. Это было проверено до того, как я опубликовал его, и вот доказательства: dbfiddle.uk /.

3. @GordonLinoff — на самом деле в коде, размещенном здесь, была ошибка. Я исправился interval '1 day' на interval '1' day . Пожалуйста 😉

4. не получается желаемый результат. Я должен получить первую дату первого квартала и последнюю дату 4-го квартала. Если я выполню запрос сегодня, то последний день текущего квартала — 30 июня 2019 года, а первая дата предыдущего 3 квартала — 01 июля 2018 года …… мы должны выбрать данные за 4 квартала, включая текущий квартал

5. @OnkarTiwari . , , Просто измените конечную дату, добавив больше месяцев.