with t(quater, begin_ymd, end_ymd) as ( select 1, '0101', '0331' from dual union all select 2, '0401', '0630' from dual union all select 3, '0701', '0930' from dual union all select 4, '1001', '1231' from dual) select :year year, :quater quater, :year||begin_ymd begin_ymd, :year||end_ymd end_ymd from t where quater = :quater ;
SELECT y, q , TO_CHAR(ADD_MONTHS(TRUNC(TO_DATE(y, 'yyyy'), 'y'), q*3-3), 'yyyymmdd') s , TO_CHAR(ADD_MONTHS(TRUNC(TO_DATE(y, 'yyyy'), 'y'), q*3)-1, 'yyyymmdd') e FROM (SELECT '2016' y, '1' q FROM dual) ; SELECT y, q , y || DECODE(q, 1, '0101', 2, '0401', 3, '0701', 4, '1001') s , y || DECODE(q, 1, '0331', 2, '0630', 3, '0930', 4, '1231') e FROM (SELECT '2016' y, '4' q FROM dual) ;