Сложната част е получаването на последния ден от тримесечието.
Това решение изчислява началния ден на диапазона чрез изваждане на 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
/
Може да има по-елегантно решение, но това е краят на моята пауза за кафе :)