A parte complicada é chegar ao último dia do trimestre.
Esta solução calcula o dia inicial do intervalo subtraindo 9 meses da data de destino e truncando com o
'Q'
máscara que nos dá o primeiro dia do trimestre. Em seguida, calculamos essa data novamente , subtrair um dia e adicionar doze meses e isso dá o último dia do trimestre atual: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
/
Pode haver uma solução mais esperta por aí, mas este é o fim da minha pausa para o café :)