Sql 将SYSDATE分配给prompt

Sql 将SYSDATE分配给prompt,sql,oracle,peoplesoft,Sql,Oracle,Peoplesoft,因此,我的SQL中有一行代码: AND ((:3 IS NOT NULL AND A.ADM_CREATION_DT BETWEEN :3 AND SYSDATE) OR :3 IS NULL AND :3 = SYSDATE) 我想让它做的是,如果提示符3或:3有一个值,它将获得ADM_CREATION_DT的所有值,该值介于:3和SYSDATE之间-这很好。不起作用的部分是:3为空时应将值设置为当前日期的SYSDATE 我得到以下错误: 由于SQL错误,运行查询时出错,代码=8006,消息

因此,我的SQL中有一行代码:

AND ((:3 IS NOT NULL
AND A.ADM_CREATION_DT BETWEEN :3 AND SYSDATE)
OR :3 IS NULL
AND :3 = SYSDATE)
我想让它做的是,如果提示符3或:3有一个值,它将获得ADM_CREATION_DT的所有值,该值介于:3和SYSDATE之间-这很好。不起作用的部分是:3为空时应将值设置为当前日期的SYSDATE

我得到以下错误:

由于SQL错误,运行查询时出错,代码=8006,消息=指定的无效数据类型50380

我认为这与将SYSDATE分配给prompt有关,因为它们的数据类型不同

有人知道如何解决这个问题吗?非常感谢你

完整查询如下:

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) ));

基于您在问题评论中所说的假设是正确的,即当日期为:3时,未提供您想要当前日期之前的所有记录的条件,解决方案是只使用一个锚定日期,在此日期之前,您将保证不会有任何记录。例如1900年1月1日

那么WHERE子句就变成了

A.ADM_CREATION_DT BETWEEN NVL(:3,TO_DATE('01-01-1900','DD-MM-YYYY')) AND SYSDATE
希望有帮助?

这可能会有帮助

我的理解是:

1如果:3不为空,则应根据:3输入的日期和系统日期填充ADM_CREATION_DT

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'));
 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是您的行政创建日期。

请填写完整的查询。无论您尝试什么,SysDate都已经是一个日期值。使用到日期。。。日期值无效。@SNC:已更新以提供完整的sql。您的意思是当:3尚未提供时,您希望所有记录保留到当前日期?这个假设正确吗?@a_horse_,没有名字,我已经更新了它,删除了to_日期,但仍然得到相同的错误。对。对不起。我不想为了这样一个简单的答案而将代码复制到IDE中。现在删除它。