Aquí hay un enfoque usando ADD_MONTHS
y EXTRACT(YEAR FROM ....)
. Simplemente sumas o restas el número de meses necesarios (siempre un múltiplo de 12, ya que solo estás cambiando el año). A diferencia del TO_CHAR
/ TO_DATE
soluciones, este enfoque maneja los días bisiestos (29 de febrero). Por otro lado, tenga en cuenta que al cambiar la fecha del 28 de febrero de 2003 al año 2012, se cambiará al 29 de febrero (ADD_MONTHS
cambia el último día de un mes al último día del mes resultante).
with
inputs as (
select date '2013-03-22' as effective_date,
date '2017-08-14' as point_date
from dual
)
-- end of TEST data (do not include in the solution!)
select effective_date, point_date,
add_months(point_date, 12 * ( extract (year from effective_date) -
extract (year from point_date) )
) as mixed_date
from inputs;
EFFECTIVE_DATE POINT_DATE MIXED_DATE
-------------- ---------- ----------
03/22/2013 08/14/2017 08/14/2013