SELECT ADD_MONTHS( TRUNC(PARAM.start_date, 'Q'), 3*(LEVEL-1) ) AS qstart
, ADD_MONTHS( TRUNC(PARAM.start_date, 'Q'), 3*(LEVEL) ) -1 AS qend
FROM ( SELECT TO_DATE('&start_date') AS start_date
, TO_DATE('&end_date') AS end_date
FROM DUAL
) PARAM
CONNECT BY ADD_MONTHS( TRUNC(PARAM.start_date, 'Q'), 3*(LEVEL) ) -1
<= PARAM.end_date
Regras para parâmetros, talvez seja necessário ajustar a consulta para atender às suas finalidades:
- Se start_date não for o início exato do trimestre, ele usará efetivamente a data de início do trimestre.
- Se end_date não for o final exato do trimestre, encerramos no trimestre que terminou ANTES de end_date (não aquele que contém a data de término).