Вы можете попробовать функцию 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
Update:
После некоторых экспериментов, кажется, самая тонкая гранулярность этой функции - День.
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
теперь я вижу, что вы явно сказали, что вы хотели DECODE. Я бы использовал CASE для такого вопроса, когда вы оцениваете логическое условие. Независимо от того, не забудьте отрезать минуты, когда вы сравниваете даты, если вы не хотите, чтобы сравнение было с максимальной точностью. – orbfish
Отличная точка зрения, я объяснил это уже, когда я работаю с датами довольно часто, но неплохо было бы упомянуть, если другие в конечном итоге смотрят на это. – Freddy