簡體   English   中英

使用 decode 函數比較 Oracle 中的日期

[英]Comparing dates in Oracle using the decode function

我需要使用 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?

有更簡單的解決方案嗎?

如果 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函數,它的作用正好相反。)

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

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

sign(a)返回-1如果a < 0 0 ,如果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;

這是更好的:

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

你可以試試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

如果您嘗試按日期檢查 - 也就是說,1/1 中的每次都小於 1/2,並且 1/1 上的每個時間都等於 1/1 上的其他時間,即使 Oracle DATE 更大- 那么你想比較如下:

TRUNC(DATE1) <= TRUNC(DATE2)

我在其他答案中沒有看到這一點,它非常基本,讓我懷疑我是否誤解了這個問題。

當 date1 >= date2 時將返回 date2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM