Показать результат между периодом

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

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

пример даты последней транзакции

1-ЯНВ-16
2-ЯНВ-16
8-ФЕВ-16
10-MAC-16

ПЕРИОД ДЛЯ ЗАПРОСА: (FROM 2-JAN-16 TO 8-FEB-16)

ЕСЛИ дата последней транзакции не находится между запросом периода, тогда отобразите результат.

 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

person zakira    schedule 20.09.2016    source источник
comment
Оба условия, похоже, используют NOT BETWEEN. Можете ли вы добавить некоторые примеры данных к вашему вопросу?   -  person Tim Biegeleisen    schedule 20.09.2016
comment
предоставить примеры результатов   -  person Beginner    schedule 20.09.2016
comment
Я хочу отобразить результаты, в которых дата, хранящаяся в таблице, не находится между датами, указанными в запросе.   -  person zakira    schedule 20.09.2016
comment
@zakira Я думаю, у вас возникли проблемы с приведенным выше запросом, потому что, как я заметил, вы пропустили «И» в последнем условии where И L.LAST_TRAN_DATE NOT BETWEEN: P_FROM_DATE AND: P_TO_DATE   -  person Susang    schedule 20.09.2016
comment
я сосредоточен на этом "И L.LAST_TRAN_DATE НЕ МЕЖДУ :P_FROM_DATE И :P_TO_DATE"   -  person zakira    schedule 20.09.2016
comment
если я использую «НЕ МЕЖДУ», результат верен для 1-го условия. но после этого я все еще хочу отображать результат в течение периода для 2-го после 1-го условия.   -  person zakira    schedule 20.09.2016
comment
сделать это просто .. я хочу отобразить результат «НЕ МЕЖДУ» в отчете оракула.   -  person zakira    schedule 20.09.2016
comment
Селамат Паги. Я только что ответил на ваш другой вопрос. На этот вопрос сложнее ответить, но я попытаюсь.   -  person Paul Maxwell    schedule 14.12.2017


Ответы (1)


Если в ваших данных есть «пробелы», SQL НЕ будет отображать отсутствующие данные, ЕСЛИ вы не сделаете что-то дополнительное. например

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

Теперь вам нужен набор строк для каждой даты с 1 января по 12 января. Есть много способов получить эти строки, ниже я использовал «подключение по уровню»; который является специфичным для 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

person Paul Maxwell    schedule 14.12.2017