2012-10-08 130 views
-1
select pdat 
     ,ac_no 
     , bal 
from dummy_table; 

PDATE  | AC_NO | BAL 
========================  
14/02/2012| abcd | 1200  
15/02/2012| abcd | 1300 
27/02/2012| abcd | 1300 

我的問題是如何讓一個排的result set to fetch從月底的Oracle SQL日期差異

PDATE  | AC_NO | BAL | Difference 
===================================== 
14/02/2012| abcd | 1200 | 8 
22/02/2012| abcd | 1300 | 7 

的區別是22/02/2012-14/02/2012的基礎上計算。 但是,我怎樣才能計算從月份的結束日期的最後日期的差異?在這種情況下29th Feb 2012

+1

爲什麼2012年2月2日第一排? 2012年2月15日和2012年2月27日的行會發生什麼? – GTG

+1

怎麼樣替代[last_day()](http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions072.htm)? – danihp

+1

@nightWatcher:你如何得到22/02/2012?哪裏有記錄15/02/2012 –

回答

3

這裏的關鍵是LEAD function - 閱讀有關analytical functions in SQL的文檔,它們是非常強大的工具。 LEAD(pdat) OVER (ORDER BY pdat)可獲得next row中的pdat值,該值爲ascending order of pdat。然後nvl function需要關心last date那裏是no next date - 它使用last_day(pdat)函數調用,它返回一個月PDAT落在最後一天

如果你想處理好幾個月 - 你需要做一些分析DECODE function檢測如果pdat和LEAD(pdat) OVER (ORDER BY pdat)屬於同一個月,並且使用LEAD(pdat) OVER (ORDER BY pdat)或last_day(pdat)作爲您比較的日期。我會把它留作你的功課。

create table dummy_table(pdat date, ac_no varchar2(10), bal number); 

insert into dummy_table values ('14-FEB-2012', 'abcd', 1200); 
insert into dummy_table values ('15-FEB-2012', 'abcd', 1300); 
insert into dummy_table values ('27-FEB-2012', 'abcd', 1300); 

select pdat 
    , ac_no 
    , bal 
    , nvl(lead(pdat) over (order by pdat) - pdat, last_day(pdat) - pdat) 
    from dummy_table; 

2/14/2012 abcd 1200 1 
2/15/2012 abcd 1300 12 
2/27/2012 abcd 1300 2