8

我需要使用 Oracle 解码功能比较两个日期以查看一个日期是否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 这不会返回 date2 吗?

还是只是 date1 > date2?

有更简单的解决方案吗?

4

6 回答 6

21

如果 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允许不等式运算符,因此更具可读性。


或者,如果您想更简洁,可以使用旨在返回 n 值中较低值的函数:

SELECT LEAST(date1, date2) FROM Your_Table;

(还有一个GREATEST功能相反。)

于 2010-09-01T15:58:12.007 回答
7

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

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

sign(a)返回-1if a < 00ifa = 01if 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;
于 2010-09-01T16:57:02.723 回答
1

你可以试试这个months_between功能。它将计算两个日期之间的月数,作为十进制数。

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

在此示例中,第一个参数大于第二个参数,因此它将返回 1。第二行返回 ~0.48(在 2010 年 9 月 1 日上午 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

于 2010-09-01T15:17:59.623 回答
1

如果您尝试按日期检查 - 也就是说,1/1 中的每个时间都小于 1/2,并且 1/1 上的每个时间都等于 1/1 上的每个其他时间,即使 Oracle DATE 更大- 那么你想比较如下:

TRUNC(DATE1) <= TRUNC(DATE2)

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

于 2010-09-02T14:55:29.047 回答
1

这个更好:

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
于 2015-09-16T16:17:19.880 回答
0

当 date1 >= date2 时将返回 date2

于 2010-09-01T15:17:55.487 回答