同一个语句在帆软执行报错ORA-01861文字与格式不匹配,但是把SQL语句放到数据库工具能正常执行

先补充最终问题及总结,细节见下方案例

(v3实际错误定位点) FROM上方所使用到TO_DATE的转换栏位中有无法转换成日期格式的数据导致。。

    为什么能够在数据库工具查询,但是帆软会报错? -->因为PLSQL(数据库工具)查询只显示前50行数据,帆软会抓取所有的数据..所以没有在第一时间发现.

最后感谢【CD20160914】大佬的解答~

--V1

报错截图:

image.png

(v1错误定位..)问题基本可以锁定在最下方的两个语句,除了使用下方语句的方案,还有使用to_char(to_date(变量),'YYYYMMDD HH24MISS')的方案,以及将两边的栏位都分别转换为date或char的方式,运行结果都是在数据库工具可以执行,但是在帆软报同样的错误

执行语句如下:

SELECT DISTINCT LH.PRODUCTNAME,

LH.STAGENAME,

NVL(OEE.OA_STATION_CODE,OEE.STATION_CODE) STATION,

BE.EQPTYPE,

EH.EQPID,

EH.EVENTTIME,

(SELECT DISTINCT B.CUSTDATA  FROM EQP_STATE_HIST A,DATA_MAPPING B WHERE A.EQPID = EH.EQPID AND A.EQPSTATE = B.DATA AND B.DATATYPE = 'OEEEQPSTATUS'  

       AND A.EVENTTIME = (SELECT MAX(EVENTTIME) FROM EQP_STATE_HIST WHERE EQPID = EH.EQPID AND EVENTTIME <= EH.EVENTTIME)  

    ) AS STATUS, 

(SELECT MAX(A.EVENTTIME) FROM EQP_STATE_HIST A,YIBU_DATA_MAPPING B WHERE A.EQPID = EH.EQPID AND B.DATATYPE = 'OEEEQPSTATUS' AND A.EQPSTATE = B.DATA AND A.EVENTTIME

(SELECT MIN(TO_DATE(A.PRESTATETIME)) FROM EQP_STATE_HIST A,DATA_MAPPING B WHERE A.EQPID = EH.EQPID AND B.DATATYPE = 'OEEEQPSTATUS' AND A.EQPSTATE = B.DATA AND A.EVENTTIME

FROM EQP_STATE_HIST EH

LEFT JOIN LOT_STEP_HIST LH ON LH.EQPID = EH.EQPID

LEFT JOIN BASE_EQP BE ON BE.EQPID = EH.EQPID

RIGHT JOIN MESOEEMAINTENANCE OEE ON OEE.EQPID = EH.EQPID AND OEE.SHOW_FLAG = 'Y'

WHERE 1=1

${if(len(STARTDATE)=0,""," AND TO_CHAR(EH.EVENTTIME,'YYYYMMDD HH24MISS') >= '"+STARTDATE+"'||' 073000'")}

${if(len(ENDDATE)=0,""," AND TO_CHAR(EH.EVENTTIME,'YYYYMMDD HH24MISS') < '"+ENDDATE+"'||' 073000'")}

--v2 补充变量格式设置以及传参格式

见下图,STARTDATE的格式设置为日期型(yyyyMMdd),公式使用TODAY()

image.png

FineReport Aybo.Wang 发布于 2024-11-1 13:45 (编辑于 2024-11-1 16:39)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
CD20160914Lv8专家互助
发布于2024-11-1 13:49(编辑于 2024-11-1 13:59)

你的参数格式是如何的?要类似20241015这样的。

SELECT DISTINCT LH.PRODUCTNAME,

LH.STAGENAME,

NVL(OEE.OA_STATION_CODE,OEE.STATION_CODE) STATION,

BE.EQPTYPE,

EH.EQPID,

EH.EVENTTIME,

(SELECT DISTINCT B.CUSTDATA  FROM EQP_STATE_HIST A,YIBU_DATA_MAPPING B WHERE A.EQPID = EH.EQPID AND A.EQPSTATE = B.YIBUDATA AND B.DATATYPE = 'OEEEQPSTATUS'  

       AND A.EVENTTIME = (SELECT MAX(EVENTTIME) FROM EQP_STATE_HIST WHERE EQPID = EH.EQPID AND EVENTTIME <= EH.EVENTTIME)  

    ) AS STATUS, 

(SELECT MAX(A.EVENTTIME) FROM EQP_STATE_HIST A,YIBU_DATA_MAPPING B WHERE A.EQPID = EH.EQPID AND B.DATATYPE = 'OEEEQPSTATUS' AND A.EQPSTATE = B.YIBUDATA AND A.EVENTTIME

(SELECT MIN(TO_DATE(A.PRESTATETIME)) FROM EQP_STATE_HIST A,YIBU_DATA_MAPPING B WHERE A.EQPID = EH.EQPID AND B.DATATYPE = 'OEEEQPSTATUS' AND A.EQPSTATE = B.YIBUDATA AND A.EVENTTIME

FROM EQP_STATE_HIST EH

LEFT JOIN LOT_STEP_HIST LH ON LH.EQPID = EH.EQPID

LEFT JOIN BASE_EQP BE ON BE.EQPID = EH.EQPID

RIGHT JOIN MESOEEMAINTENANCE OEE ON OEE.EQPID = EH.EQPID AND OEE.SHOW_FLAG = 'Y'

WHERE 1=1

 AND TO_CHAR(EH.EVENTTIME,'YYYYMMDD HH24MISS') >= '20241025'||' 073000'

 AND TO_CHAR(EH.EVENTTIME,'YYYYMMDD HH24MISS') < '20241101'||' 073000'

image.png

  • Aybo.Wang Aybo.Wang(提问者) 你好,上图我补了变量的格式以及所用到的公式,还请在帮忙看下
    2024-11-01 13:56 
  • CD20160914 CD20160914 回复 Aybo.Wang(提问者) 你按我说的,把语句复制出来。放在plsql中是否可以执行?
    2024-11-01 13:57 
  • CD20160914 CD20160914 回复 Aybo.Wang(提问者) 你看一下上面的语句复制到你的plsql中是否可以执行?
    2024-11-01 13:59 
  • CD20160914 CD20160914 回复 Aybo.Wang(提问者) 你的EH.EVENTTIME在表中是日期字段类型的?
    2024-11-01 14:00 
  • Aybo.Wang Aybo.Wang(提问者) 回复 CD20160914 是可以执行,并且无论我前后两个栏位怎么切换格式,在PLSQL都可以执行,但是在帆软就会报错。。所以很苦恼..我也尝试在帆软生成SQL的页面传参不使用公式,而是换成字符串直接写固定值,依旧还是报相同错误
    2024-11-01 14:02 
最佳回答
0
shirokoLv6资深互助
发布于2024-11-1 13:50

跟参数有关系吧。你点这个image.png,填好你报错的参数,然后复制结果放到数据库工具看看是否能正常执行?

  • Aybo.Wang Aybo.Wang(提问者) 你好,这个我试了,里面抓出来的语句可以在数据库工具成功执行,但是放在帆软里面怎么更换格式执行都不可以..感谢~
    2024-11-01 13:58 
最佳回答
0
yoggaLv5见习互助
发布于2024-11-1 13:58

日期参数格式问题导致的。每个日期参数在sql里套个substr(日期参数,1,10)再进行格式处理

最佳回答
0
华莉星宸Lv7资深互助
发布于2024-11-1 14:11

这里改一下看看

${if(len(STARTDATE)=0,""," AND TO_CHAR(EH.EVENTTIME,'YYYYMMDD HH24MISS') >= '"+STARTDATE+" 073000'")}

${if(len(ENDDATE)=0,""," AND TO_CHAR(EH.EVENTTIME,'YYYYMMDD HH24MISS') < '"+ENDDATE+" 073000'")}

 

image.png

  • Aybo.Wang Aybo.Wang(提问者) 感谢,已经找到问题点了,我最开始的问题定位错误了...实际的错误点是在FROM 语句上方使用到的TO_DATE语句,这里面的数据有无法转换成日期格式的.
    2024-11-01 16:28 
  • 5关注人数
  • 249浏览人数
  • 最后回答于:2024-11-1 16:39
    请选择关闭问题的原因
    确定 取消
    返回顶部