【问题标题】:ORA-01861: literal does not match format string when count(*) is usedORA-01861: 使用 count(*) 时文字与格式字符串不匹配
【发布时间】:2015-02-03 15:37:29
【问题描述】:

当我执行给定的查询时,我遇到了错误。当我用 * 替换 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”修饰符已打开,文字必须完全匹配, 没有额外的空格。 *操作:更正格式字符串以匹配文字。

【问题讨论】:

  • 更改:ERR_CODE = nvl('', ERR_CODE) AND to:ERR_CODE IS NULL AND
  • 它工作正常sqlfiddle.com/#!4/d41d8/38317你可能没有你在TRANS_ST_DATE中的想法

标签: sql plsql


【解决方案1】:

您可能正在使用像 SQL Developer 或 PL/SQL Developer 这样的前端客户端,当您执行 select * from table 时,这些客户端仅返回几行,例如前 50 或 500 行。因此,您的查询在执行 select * from table

时返回结果

谈到您面临的问题,通常是在 ate 无法转换为所需格式时出现。因此,您需要检查TRANS_ST_DATE 列中的内容。

最后修改 NVL 子句,正如 @jim mcnamara 在他的评论中所建议的那样,因为你使用它的方式在逻辑上是不正确的

希望对你有帮助

维沙德

【讨论】:

  • 谢谢兄弟...你说得对。它的 sql 开发人员。有 25 行类型为“20110818”,其中百万行的值为“18/08/11”。
【解决方案2】:

首先,承诺以后不再将数据存储为字符串。 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 '__/__/__')

【讨论】:

  • 非常感谢...它帮助我找到了有问题的值并更正了它们。我正在处理的这张桌子是第 3 方的。我发誓我没有/不会犯同样的错误..哈哈哈。再次感谢!!!
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 2015-01-11
  • 2010-11-26
  • 2012-10-09
  • 1970-01-01
相关资源
最近更新 更多