Usted podría intentar la función months_between
. Calculará el número de meses entre dos fechas, como un número decimal.
select months_between(sysdate+30, sysdate) from dual;
select months_between(sysdate+15, sysdate) from dual;
En este ejemplo, el primer parámetro de es mayor que el segundo por lo que volverá 1. La segunda línea muestra ~ 0,48 (cuando se ejecuta a las 11:30 de la mañana del 2010-09-01) Para obtener el los valores de fecha reales:
select case when months_between(sysdate+30, sysdate) > 0 then sysdate+30 else sysdate end from dual;
En general:
case when months_between(dateA, dateB) > 0 then dateA else dateB
actualización:
Después de algunos experimentos, parece que la granularidad más fina de esta función es Día.
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;
... devolverá 0
pero
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;
volverá ,032258064516129.
Algunos otra diferencia interesante fecha/comparar las técnicas aquí: http://www.orafaq.com/faq/how_does_one_get_the_time_difference_between_two_date_columns
ahora veo que usted ha dicho explícitamente que quería DECODE. Usaría CASE para una pregunta como esta en la que está evaluando una condición booleana. De todos modos, no te olvides de cortar los minutos cuando comparas fechas, a menos que quieras la comparación con la máxima precisión. – orbfish
Excelente punto, lo tuve en cuenta ya que trabajo con fechas bastante a menudo, pero es bueno mencionarlo si otros terminan mirando esto. – Freddy