2010-09-01 12 views
6

我需要使用Oracle解碼函數來比較兩個日期,以查看是否有另一個是less than or equal使用解碼函數在Oracle中比較日期

我發現這篇文章 - http://www.techonthenet.com/oracle/functions/decode.php

其中規定(底部),其下面的解碼功能將返回日期2,如果日期1> date2的:

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

這會不會,如果日期1> =返回日期2 date2?

還是僅僅如果date1> date2?

有沒有更簡單的解決方案?

回答

18

這功能,如果date2的< = DATE1返回日期2。插入值並轉換爲僞代碼,即可獲得if 0 - 0 = 0 then date2 else date1,其中兩個日期都相同。

最好的解決辦法,如果你正在使用8i或更高版本是使用case

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

由於case允許不平等的運營商,它更具有可讀性。

0

將返回date2的當日期1> = date2的

1

你可以嘗試months_between功能。它會計算兩個日期之間的月數,作爲十進制數。

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

在這個例子中,第一paramater是大於第二所以它會返回1。第二行返回〜0.48(當在約11:30 AM上2010-09-01執行)爲了得到實際日期值:

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

7

@Allan已經給你提供了最好的解決方案,但如果你堅持使用decode函數,你可以改爲處理sign函數的結果。

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

sign(a)回報-1如果a < 00如果a = 01如果a > 0。也就是說,在每1/1時間短 -

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; 
1

如果你想按日期查詢:因此,下面的邏輯

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

可以通過以下方式使用decode被改寫超過1/2,每對1/1等於1/1上的每個其他時間,即使在Oracle日期大於 - 那麼你要比較如下:

TRUNC(DATE1)< = TRUNC( DATE2)

我在其他答案中沒有看到這一點,它很基本,這讓我想知道我是否誤解了這個問題。

+1

我現在看到你明確地說要進行解碼。我會使用CASE來解決這個問題,在這裏你正在評估一個布爾條件。無論如何,除非您想要比較最高精度,否則不要忘記在比較日期時切斷分鐘。 – orbfish 2010-09-02 14:59:39

+0

非常好的一點,我已經說明了這一點,因爲我經常與日期一起工作,但如果其他人最終會看到這一點,這是一個很好的提示。 – Freddy 2010-09-02 20:09:41

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 
+0

只有英文請 – durron597 2015-09-16 16:27:06