Вы можете попробовать функцию months_between
.Он вычислит количество месяцев между двумя датами в виде десятичного числа.
select months_between(sysdate+30, sysdate ) from dual;
select months_between(sysdate+15, sysdate ) from dual;
В этом примере первый параметр больше второго, поэтому он вернет 1. Вторая строка возвращает ~ 0,48 (при выполнении около 11:30 утра 2010-09-01) Чтобы получить фактические значения даты:
select case when months_between(sysdate+30, sysdate ) > 0 then sysdate+30 else sysdate end from dual;
В общем:
case when months_between(dateA, dateB ) > 0 then dateA else dateB
Обновление:
После некоторых экспериментов кажется, что самая тонкая гранулярность этой функции - Day.
select months_between(to_date('2010-10-16 23:59:59', 'YYYY-MM-DD HH24:MI:SS'),
to_date('2010-10-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
from dual;
... вернет 0
, но
select months_between(to_date('2010-10-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),
to_date('2010-10-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
from dual;
вернет 0.032258064516129.
Некоторые другие интересные различия в датах / методы сравнения здесь: http://www.orafaq.com/faq/how_does_one_get_the_time_difference_between_two_date_columns