Sql 将SYSDATE分配给prompt
因此,我的SQL中有一行代码: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,消息
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中。现在删除它。