我需要使用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?
有更简单的解决方案吗?
答案 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 < 0
,0
a = 0
和1
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)
将返回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