Här är ett tillvägagångssätt som använder ADD_MONTHS
och EXTRACT(YEAR FROM ....)
. Du lägger helt enkelt till eller subtraherar det antal månader som behövs (alltid en multipel av 12, eftersom du bara ändrar år). Till skillnad från TO_CHAR
/ TO_DATE
lösningar hanterar detta tillvägagångssätt skottdagar (29 februari). Å andra sidan, kom ihåg att om du ändrar datumet från 28 februari 2003 till år 2012 kommer det att ändras till 29 februari (ADD_MONTHS
ändrar den sista dagen i en månad till den sista dagen i den resulterande månaden).
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