2016-09-20 6 views
0

Я хочу показать результаты, в которых дата, хранящаяся в таблице, не находится между датами, указанными в запросе.Результат отображения между периодом

если last_Tran_date != from_date и если last_Tran_date != to_date поэтому нет транзакции. , поэтому я хотел бы показать результат.

Пример последняя дата транзакции

1-JAN-16
2-ЯН-16
8-февралем-16
10-МАС-16

Период до ВОПРОС: (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

два условия оба, кажется, использует 'НЕ 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 января по 12 января. Есть много способов получить эти строки, ниже я использовал «connect by 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

 Смежные вопросы

  • Нет связанных вопросов^_^