当我执行给定的查询时,会出现以下错误。当我将count(*)替换为*时,相同的查询返回结果,但仍然在结果集中滚动使我再次出现相同的错误。请帮我解决这个问题。
SELECT count(*)
FROM cd_table
WHERE
SW_CODE = 'PSTN' AND
CRP_CODE = 'WLR' AND
ERR_CODE = nvl('', ERR_CODE) AND
PRS_ID = 'E' AND
STATUS in ('0', '1') and
TO_DATE(TRANS_ST_DATE,'DD/MM/YY') > sysdate-90 ;TRANS_ST_DATE中的值是varchar,数据看起来类似于23/09/14。
ORA- 01861 :文字不匹配格式字符串01861。00000 -“文字不匹配格式字符串”*原因:输入中的文字必须与格式字符串中的文字长度相同(除前导空格外)。如果"FX“修饰符已经打开,则文字必须完全匹配,没有额外的空格。*操作:更正格式字符串以匹配文字。
发布于 2014-12-05 13:00:51
首先,承诺以后不会将数据存储为字符串。SQL有用于日期/时间的本机类型。用它们。
显然,列的格式不是您所期望的。你可以试试这个:
(CASE WHEN SUBSTR(TRANS_ST_DATE, 1, 2) BETWEEN '01' and '31' and
SUBSTR(TRANS_ST_DATE, 4, 2) BETWEEN '01' and '12' AND
TRANS_ST_DATE LIKE '__/__/__'
THEN TO_DATE(TRANS_ST_DATE,'DD/MM/YY')
END) > sysdate - 90您可以通过这样的方法找到违规的值:
select TRANS_ST_DATE
from cd_table
where (NOT SUBSTR(TRANS_ST_DATE, 1, 2) BETWEEN '01' and '31') OR
(NOT SUBSTR(TRANS_ST_DATE, 4, 2) BETWEEN '01' and '12') OR
(TRANS_ST_DATE NOT LIKE '__/__/__')发布于 2014-12-05 13:02:51
您可能正在使用像SQL或PL/SQL这样的前端客户端,这些客户机在执行select * from table时只返回几行,比如前50或500行。因此,您的查询在执行select * from table时返回结果。
谈到您所面临的问题,通常情况下,ate无法转换为所需的格式。因此,您需要检查TRANS_ST_DATE列中的内容。
最后,将NVL子句修改为@jim mcnamara在他的评论中建议,因为您使用它的方式在逻辑上是不正确的。
希望它能帮上忙
维沙德
https://stackoverflow.com/questions/27316361
复制相似问题