你可以嘗試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
我現在看到你明確地說要進行解碼。我會使用CASE來解決這個問題,在這裏你正在評估一個布爾條件。無論如何,除非您想要比較最高精度,否則不要忘記在比較日期時切斷分鐘。 – orbfish 2010-09-02 14:59:39
非常好的一點,我已經說明了這一點,因爲我經常與日期一起工作,但如果其他人最終會看到這一點,這是一個很好的提示。 – Freddy 2010-09-02 20:09:41