Назначение SYSDATE для запроса - PullRequest
0 голосов
/ 09 мая 2018

Итак, у меня есть эта строка кода в моем SQL:

AND ((:3 IS NOT NULL
AND A.ADM_CREATION_DT BETWEEN :3 AND SYSDATE)
OR :3 IS NULL
AND :3 = SYSDATE)

То, что я хочу сделать, это то, что если Prompt 3 или: 3 имеет значение, он получает все значение ADM_CREATION_DT, которое находится между значениями: 3 и SYSDATE - это работает нормально. Что не работает, так это то, что когда: 3 пусто, следует установить значение SYSDATE, которое является текущей датой.

Я получаю ошибку ниже:

Ошибка при выполнении запроса из-за ошибки SQL, код = 8006, сообщение = указан неверный тип данных (50,380)

Я думаю, что это как-то связано с назначением SYSDATE для приглашения, где их тип данных отличается.

Кто-нибудь, кто знает, как это исправить? Большое вам спасибо.

Полный запрос представлен ниже:

SELECT A.EMPLID, B.NAME, A.ACAD_CAREER, G.STDNT_CAR_NBR, A.ADM_APPL_NBR, A.INSTITUTION, TO_CHAR(A.ADM_CREATION_DT,'YYYY-MM-DD'), TO_CHAR(A.ADM_UPDATED_DT,'YYYY-MM-DD'), A.ADM_APPL_COMPLETE, TO_CHAR(A.ADM_APPL_CMPLT_DT,'YYYY-MM-DD'), D.SRVC_IND_CD, D.SRVC_IND_REASON, E.UM_CTXT_WP_FLAG, E.UM_CTXT_WPPLS_FLAG 
  FROM (PS_ADM_APPL_DATA A LEFT OUTER JOIN  PS_SAD_UC_APPLREC C ON  A.EMPLID = C.EMPLID AND C.INSTITUTION = A.INSTITUTION ), PS_PERSON_NAME B, PS_SRVC_IND_DATA D, PS_UM_CTXT_PERCTXT E, PS_SAD_UC_DEC_MAT F, PS_ADM_APPL_PROG G 
  WHERE (( A.EMPLID = B.EMPLID 
     AND A.EMPLID = D.EMPLID 
     AND C.INSTITUTION = E.INSTITUTION 
     AND C.SAD_UC_APPCODE = E.SAD_UC_APPCODE 
     AND C.SAD_UC_PERS_ID = E.SAD_UC_PERS_ID 
     AND E.EFFDT = 
        (SELECT MAX(E_ED.EFFDT) FROM PS_UM_CTXT_PERCTXT E_ED 
        WHERE E.INSTITUTION = E_ED.INSTITUTION 
          AND E.SAD_UC_APPCODE = E_ED.SAD_UC_APPCODE 
          AND E.SAD_UC_PERS_ID = E_ED.SAD_UC_PERS_ID 
          AND E_ED.EFFDT <= SYSDATE) 
    AND E.EFFSEQ = 
        (SELECT MAX(E_ES.EFFSEQ) FROM PS_UM_CTXT_PERCTXT E_ES 
        WHERE E.INSTITUTION = E_ES.INSTITUTION 
          AND E.SAD_UC_APPCODE = E_ES.SAD_UC_APPCODE 
          AND E.SAD_UC_PERS_ID = E_ES.SAD_UC_PERS_ID 
          AND E.EFFDT = E_ES.EFFDT) 
     AND C.INSTITUTION = F.INSTITUTION 
     AND C.SAD_UC_APPCODE = F.SAD_UC_APPCODE 
     AND C.SAD_UC_PERS_ID = F.SAD_UC_PERS_ID 
     AND A.EMPLID = G.EMPLID 
     AND A.ACAD_CAREER = G.ACAD_CAREER 
     AND A.STDNT_CAR_NBR = G.STDNT_CAR_NBR 
     AND A.ADM_APPL_NBR = G.ADM_APPL_NBR 
     AND G.EFFDT = 
        (SELECT MAX(G_ED.EFFDT) FROM PS_ADM_APPL_PROG G_ED 
        WHERE G.EMPLID = G_ED.EMPLID 
          AND G.ACAD_CAREER = G_ED.ACAD_CAREER 
          AND G.STDNT_CAR_NBR = G_ED.STDNT_CAR_NBR 
          AND G.ADM_APPL_NBR = G_ED.ADM_APPL_NBR 
          AND G.APPL_PROG_NBR = G_ED.APPL_PROG_NBR 
          AND G_ED.EFFDT <= SYSDATE) 
    AND G.EFFSEQ = 
        (SELECT MAX(G_ES.EFFSEQ) FROM PS_ADM_APPL_PROG G_ES 
        WHERE G.EMPLID = G_ES.EMPLID 
          AND G.ACAD_CAREER = G_ES.ACAD_CAREER 
          AND G.STDNT_CAR_NBR = G_ES.STDNT_CAR_NBR 
          AND G.ADM_APPL_NBR = G_ES.ADM_APPL_NBR 
          AND G.APPL_PROG_NBR = G_ES.APPL_PROG_NBR 
          AND G.EFFDT = G_ES.EFFDT) 
     AND 1 = 1 AND  F.SAD_UC_MAT_TEXT <> 'SATISFIED' 
     AND E.UM_CTXT_WP_FLAG = 'Y' 
     AND E.UM_CTXT_WPPLS_FLAG = 'Y' 
     AND D.SRVC_IND_CD = 'MC1' 
     AND D.SRVC_IND_CD = 'MDS' 
     AND A.INSTITUTION = :1 
     AND ( A.ACAD_CAREER = :2 
     OR ' ' = :2) 
     AND 1 = 1 AND ((  A.EMPLID = :4 
OR ' ' = :4 
AND (  A.INSTITUTION = :1 
AND  A.ACAD_CAREER = :2)) ) 
     AND 1 = 1 AND ((TO_DATE(:3,'YYYY-MM-DD') IS NOT NULL
AND  A.ADM_CREATION_DT BETWEEN TO_DATE(:3,'YYYY-MM-DD') AND SYSDATE)
OR TO_DATE(:3,'YYYY-MM-DD') IS NULL
AND TO_DATE(:3,'YYYY-MM-DD') = SYSDATE) ));

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это может помочь.

Что я понял:

1) если: 3 не равно нулю, то оно должно заполнить ADM_CREATION_DT из: 3 (введенная дата и системный номер)

2) Но в случае, если: 3 не равно нулю, тогда ADM_CREATION_DT должен быть установлен на SYSDATE или меньше, чем SYSDATE. Если это так, пожалуйста, следуйте этому.

 select NVL(A.date1,SYSDATE) dt from dummytab A
 where 
 (TO_DATE(:3,'YYYY-MM-DD') IS NOT NULL
  AND  A.date1 BETWEEN TO_DATE(:3,'YYYY-MM-DD') AND SYSDATE)
   OR (TO_DATE(:3,'YYYY-MM-DD') IS NULL
           AND TO_DATE(A.date1,'YYYY-MM-DD') <=  TO_DATE(SYSDATE,'YYYY-MM-DD'));

Или

2) Но в случае, если: 3 не является нулевым, тогда ADM_CREATION_DT должен установить значение SYSDATE. Если это так, пожалуйста, следуйте этому.

 select NVL(A.date1,SYSDATE) dt from dummytab A
  where 
  (TO_DATE(:3,'YYYY-MM-DD') IS NOT NULL
  AND  A.date1 BETWEEN TO_DATE(:3,'YYYY-MM-DD') AND SYSDATE)
  OR (TO_DATE(:3,'YYYY-MM-DD') IS NULL);

Здесь date1 - это ваша ADM_CREATION_DATE.

0 голосов
/ 09 мая 2018

Исходя из предположения (вы сказали, что это было правильно в комментариях к вопросу), что когда дата: 3 не указана, вы хотите, чтобы все записи были до текущей даты, решение состоит в том, чтобы просто использовать дату привязки, до которой вы гарантированно никогда не будет никаких записей. Например, 1-Jan-1900

Таким образом, предложение WHERE становится

A.ADM_CREATION_DT BETWEEN NVL(:3,TO_DATE('01-01-1900','DD-MM-YYYY')) AND SYSDATE

Надеюсь, это поможет?

...