使用解码函数比较Oracle中的日期

时间:2010-09-01 15:12:25

标签: sql oracle date decode date-arithmetic

我需要使用Oracle解码函数比较两个日期,以查看一个日期是less than or equal到另一个日期。

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

如果date1>,则说明下面的解码函数将返回date2的状态(在底部) date2:

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

如果date1> = date2,这不会返回date2吗?

或者仅仅是date1> DATE2?

有更简单的解决方案吗?

6 个答案:

答案 0 :(得分:18)

如果date2< = date1,该函数将返回date2。插入值并转换为伪代码,得到两个日期相同的if 0 - 0 = 0 then date2 else date1

如果您使用8i或更高版本,最佳解决方案是使用case

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

由于case允许不等式运算符,因此它更具可读性。

答案 1 :(得分:7)

@Allan已经为您提供了最佳解决方案,但如果您坚持使用decode函数,则可以处理sign函数的结果。

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

sign(a)返回-1 a < 00 a = 01 a > 0。因此,以下逻辑

if date1 >= date2 then
    return date1;
else
    return date2;
end if;
可以使用decode以下列方式重写

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;

答案 2 :(得分:1)

您可以尝试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

答案 3 :(得分:1)

如果你试图按日期检查 - 也就是说,每次1/1小于1/2,并且1/1的每一次都等于1/1的每隔一次,即使是Oracle DATE更大 - 那么你想比较如下:

TRUNC(DATE1)&lt; = TRUNC(DATE2)

我在其他答案中没有看到这一点,它是如此基本,让我想知道我是否误解了这个问题。

答案 4 :(得分:0)

当date1&gt; = date2

时,

将返回date2

答案 5 :(得分:0)

这样更好:

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