代码之家  ›  专栏  ›  技术社区  ›  Freddy

使用decode函数比较Oracle中的日期

  •  7
  • Freddy  · 技术社区  · 14 年前

    less than or equal 另一个。

    我找到了这篇文章- http://www.techonthenet.com/oracle/functions/decode.php

    如果date1>date2,下面的decode函数将返回date2:

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

    或者只是date1>date2?

    有更简单的解决办法吗?

    6 回复  |  直到 13 年前
        1
  •  21
  •   Allan    5 年前

    if 0 - 0 = 0 then date2 else date1 两个日期相同的地方。


    case

    SELECT CASE WHEN date1 >= date2 THEN date2 ELSE date1 END FROM Your_Table;
    

    案例 允许不等式运算符,可读性更好。


    或者,如果希望更简洁,可以使用设计为返回n个值中较低值的函数:

    SELECT LEAST(date1, date2) FROM Your_Table;
    

    GREATEST 函数,其作用正好相反。)

        2
  •  7
  •   APC    14 年前

    decode 函数,可以处理 sign 而不是功能。

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

    sign(a) 退货 -1 如果 a < 0 , 0 如果 a = 0 1 a > 0 . 因此,以下逻辑

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

    可以用 解码 按以下方式:

    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;
    
        3
  •  1
  •   FrustratedWithFormsDesigner    14 年前

    你可以试试 months_between

    select months_between(sysdate+30, sysdate ) from dual;
    select months_between(sysdate+15, sysdate ) from dual;
    

    在本例中,第一个参数大于第二个参数,因此它将返回1。第二行返回~0.48(在2010-09-01上午11:30执行时)以获取实际日期值:

    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

        4
  •  1
  •   orbfish    14 年前

    TRUNC(日期1)<=TRUNC(日期2)

        5
  •  1
  •   durron597    9 年前

    这样更好:

    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
    
        6
  •  0
  •   Michael Pakhantsov    14 年前

    当date1>=date2时,将返回date2