Trudną częścią jest zdobycie ostatniego dnia kwartału.
To rozwiązanie oblicza dzień początkowy zakresu, odejmując 9 miesięcy od daty docelowej, a następnie obcinając za pomocą 'Q'
maska która daje nam pierwszy dzień kwartału. Następnie obliczamy tę datę ponownie , odejmij jeden dzień, a następnie dodaj dwanaście miesięcy, co daje ostatni dzień bieżącego kwartału:
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
/
Być może istnieje lepsze rozwiązanie, ale to już koniec mojej przerwy na kawę :)