Ето подход, използващ ADD_MONTHS
и EXTRACT(YEAR FROM ....)
. Просто добавяте или изваждате необходимия брой месеци (винаги кратно на 12, тъй като сменяте само годината). За разлика от TO_CHAR
/ TO_DATE
решения, този подход се справя с високосните дни (29 фев.). От друга страна, имайте предвид, че промяната на датата от 28 февруари 2003 г. на 2012 г. ще я промени на 29 февруари (ADD_MONTHS
променя последния ден от месеца на последния ден от получения месец).
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