2016-09-20 45 views
0

我想要顯示結果,其中存儲在表中的日期不在查詢中指定的日期之間。顯示結果期間

if last_Tran_date != from_date and if last_Tran_date != to_date 因此沒有交易。 所以我想顯示結果。

例如 最後一次交易日期

1-JAN-16
2-JAN-16
8-FEB-16
10-MAC-16

PERIOD TO QUERY:(FROM 2-JAN-16 TO 8-FEB-16

I F最後交易日期不在期間查詢, 然後顯示結果。

SELECT L.TDR_CODE||' - '||T.TDR_NAME TDR_CODE,L.CLIENT_NO,L.CLIENT_TYPE 
     ,L.AMLA_RISK,L.ACCT_TYPE,L.CLIENT_NAME,L.DATE_CREATED,L.ANNUAL_INCOME 
     ,L.NET_WORTH,L.ACCT_GROUP,L.PAIDUP_CAPITAL,L.SHAREHOLDER_FUND,L.OCCUPATION 
     ,L.LAST_TRAN_DATE,K.CHQ_BANK,K.CHQ_NO,K.CHQ_AMT,decode(K.category,'3' 
     , decode(nvl(K.cancel_flag,'N'),'N',1,-2) ,0) chqamt_cash 
FROM BOS_M_CLIENT L 
     , BOS_M_TRADER T,BOS_M_LEDGER_REC K 
WHERE ((K.CHQ_NO IS NOT NULL AND K.CHQ_AMT>50000) 
     OR (K.CATEGORY='3' AND K.CHQ_AMT>10000)) 
     AND L.PROHIBIT_TRADE<>'C' 
     AND L.CLIENT_NO = K.CLIENT_NO(+) 
     AND L.amla_risk='High' 
     AND L.TDR_CODE=T.TDR_CODE 
     AND L.tdr_code>=:P_FROM_TDR_CODE 
     AND L.tdr_code<=:P_TO_TDR_CODE 
     AND K.TRAN_DATE>=:P_FROM_DATE 
     AND K.TRAN_DATE<=:P_TO_DATE 
     AND L.LAST_TRAN_DATE NOT BETWEEN :P_FROM_DATE AND :P_TO_DATE 
+0

這兩個條件都似乎可以用'NOT BETWEEN'。你可以在你的問題中添加一些示例數據嗎? –

+0

提供示例結果 – Beginner

+0

我希望顯示結果,其中存儲在表中的日期不在查詢中指定的日期之間。 – zakira

回答

0

如果沒有在你的數據「差距」,那麼除非你做一些額外的SQL不會顯示丟失的數據。例如

trans_date 
2016-01-01 
     -- there is a "gap" here, there are "missing dates" 
2016-01-12 

您現在需要的是從1月1日到1月12日的每個日期的一組行。有很多方法可以獲得這些行,下面我使用了「通過leve連接」;這是一個Oracle特定的技術,並演示瞭如何才能找到 「失蹤日期」:

CREATE TABLE YOURTABLE 
    (TRANS_DATE date); 

INSERT INTO YOURTABLE (TRANS_DATE) VALUES (to_date('2016-01-01','yyyy-mm-dd')); 
INSERT INTO YOURTABLE (TRANS_DATE) VALUES (to_date('2016-01-12','yyyy-mm-dd')); 
 
2 rows affected 
SELECT 
     c.cal_date, t.* 
FROM (
     SELECT to_date('2016-01-01','yyyy-mm-dd') + ROWNUM - 1 as cal_date 
     FROM (
     SELECT ROWNUM FROM (
      SELECT 1 FROM DUAL 
      CONNECT BY LEVEL <= (to_date('2016-01-12','yyyy-mm-dd') - (to_date('2016-01-01','yyyy-mm-dd')-1)) 
      ) 
     ) 
    ) c 
LEFT JOIN yourtable t ON c.cal_date = t.trans_date 
WHERE t.trans_date IS NOT NULL 
ORDER BY c.cal_date 
; 
 
CAL_DATE | TRANS_DATE 
:-------- | :--------- 
01-JAN-16 | 01-JAN-16 
12-JAN-16 | 12-JAN-16 
SELECT 
     c.cal_date, t.* 
FROM (
     SELECT to_date('2016-01-01','yyyy-mm-dd') + ROWNUM - 1 as cal_date 
     FROM (
     SELECT ROWNUM FROM (
      SELECT 1 FROM DUAL 
      CONNECT BY LEVEL <= (to_date('2016-01-12','yyyy-mm-dd') - (to_date('2016-01-01','yyyy-mm-dd')-1)) 
      ) 
     ) 
    ) c 
LEFT JOIN yourtable t ON c.cal_date = t.trans_date 
WHERE t.trans_date IS NULL 
ORDER BY c.cal_date 
; 
 
CAL_DATE | TRANS_DATE 
:-------- | :--------- 
02-JAN-16 | null  
03-JAN-16 | null  
04-JAN-16 | null  
05-JAN-16 | null  
06-JAN-16 | null  
07-JAN-16 | null  
08-JAN-16 | null  
09-JAN-16 | null  
10-JAN-16 | null  
11-JAN-16 | null  

dbfiddle here