#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 . , , Просто измените конечную дату, добавив больше месяцев.