Aqui está uma abordagem usando
ADD_MONTHS
e EXTRACT(YEAR FROM ....)
. Você simplesmente soma ou subtrai o número necessário de meses (sempre um múltiplo de 12, já que você está apenas mudando o ano). Ao contrário do TO_CHAR
/ TO_DATE
soluções, essa abordagem lida com dias bissextos (29 de fevereiro). Por outro lado, esteja ciente de que alterar a data de 28 de fevereiro de 2003 para o ano de 2012 mudará para 29 de fevereiro (ADD_MONTHS
altera o último dia de um mês para o último dia do mês 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