Necesito comparar dos fechas con el Oracle función decode para ver si uno es less than or equal a la otra.

He encontrado este artículo – http://www.techonthenet.com/oracle/functions/decode.php

Que los estados (en el fondo) que por debajo de la función decode volverá date2 si fecha1 > fecha2 :

decode((date1 - date2) - abs(date1 - date2), 0, date2, date1)

Que esto sería no volver date2 si fecha1 >= fecha2 ?

O es sólo si fecha1 > fecha2?

Hay una solución más sencilla?

OriginalEl autor Freddy | 2010-09-01

6 Comentarios

  1. 18

    Que la función devolverá date2 si date2 <= fecha1. El taponamiento en los valores y en la traducción al pseudo-código, se obtiene if 0 - 0 = 0 then date2 else date1 donde ambas fechas son las mismas.

    La mejor solución, si usted está utilizando 8i o posterior es el uso de case:

    select case when date1 >= date2 then date2 else date1 end from Your_Table;

    Desde case permite que la desigualdad de los operadores, es mucho más legible.

    OriginalEl autor Allan

  2. 7

    @Allan ya te ha dado la mejor solución para mí, pero si usted insiste en usar decode función, usted puede procesar el resultado de sign función de su lugar.

    http://www.techonthenet.com/oracle/functions/sign.php

    sign(a) devuelve -1 si a < 0, 0 si a = 0 y 1 si a > 0. Por lo tanto, la siguiente lógica

    if date1 >= date2 then
        return date1;
    else
        return date2;
    end if;

    podría escribirse utilizando decode de la siguiente manera:

    select decode(sign(date2-date1), 
                  -1 /*this means date 1 > date 2*/, date1 /* return date1*/, 
                   0 /*dates are equal */,           date1 /* again, return date1*/,
                   /*in any other case, which is date2 > date1, return date2*/ date2) 
    from dual;

    OriginalEl autor be here now

  3. 1

    Usted podría tratar de la months_between función. Se 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 paramater es mayor que el segundo, así que va a volver 1. La segunda línea devuelve ~0.48 (cuando se ejecuta cerca de las 11:30 AM en 2010-09-01) Para obtener la fecha real de los valores:

    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 mejor granularidad de esta función es el 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;

    …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á 0.032258064516129.

    Alguna otra interesante diferencia de fechas/comparar las técnicas aquí: http://www.orafaq.com/faq/how_does_one_get_the_time_difference_between_two_date_columns

    OriginalEl autor FrustratedWithFormsDesigner

  4. 1

    Si usted está tratando de comprobar por la fecha – que es, cada vez en 1/1 es menor que 1/2, y cada 1/1 es igual a cualquier otro tiempo en 1/1, incluso si la FECHA de Oracle es mayor, entonces usted quiere comparar como sigue:

    TRUNC(FECHA1) <= TRUNC(DATE2)

    No veo esto en las otras respuestas, que es lo básico hace que me pregunte si estoy incomprensión de la pregunta.

    Ahora veo que usted explícitamente dijo que quería DECODIFICAR. Me gustaría CASO de uso para una pregunta como esta, donde está la evaluación de una condición booleana. Independientemente, no se olvide de cortar los minutos cuando usted está comparando fechas, a menos que usted quiere que la comparación con el máximo de precisión.
    Excelente punto, me explica que ya que yo trabajo con fechas bastante a menudo, pero es bueno mencionar que si otros que terminan buscando en este.

    OriginalEl autor orbfish

  5. 0

    Este es mejor:

    decode(sign(trunc(sysdate) - (trunc(sysdate))), 1, 1, -1, -1, 0 , 0)
    
    1: date 1 > date 2
    0: date 1 = date 2
    -1: date 1 < date 2
    Sólo en inglés por favor

    OriginalEl autor Ciurdy

Dejar respuesta

Please enter your comment!
Please enter your name here