【问题标题】:"ORA-01843: not a valid month" error Oracle SQL“ORA-01843: not a valid month”错误 Oracle SQL
【发布时间】:2017-04-01 18:50:05
【问题描述】:

请帮忙。我在这里犯了一个小错误,但即使在阅读了前面的问题后我也无法找到它。

SELECT TRUNC (SYSDATE) - TO_DATE (open_date_txt, 'yyyy-mm-dd') AS Days_open
FROM 'table'
WHERE TRUNC (SYSDATE) - TO_DATE (open_date_txt, 'yyyy-mm-dd') > 90 AND
      TRUNC (SYSDATE) - TO_DATE (open_date_txt, 'yyyy-mm-dd') < 120

查询运行没有错误,但是当我从结果中选择所有数据时(通过执行 ctrl+A),我得到 ORA-1843: not a valid month。

NLS_DATE_FORMAT 是 DD-MON-RR NLS_DATE_LANGUAGE 是美国的

该表有 2 列,open_date_txt 字段在数据库中存储为 varchar2(10)。请看下文

Name    open_date_txt
AA      2010-03-24
BB      2010-07-23
CC      2015-09-20
DD      1997-03-25

谢谢。

另外,我对不正确的数据模型感到震惊。此日期字段的值如 '0--' 、大于 12 的月份值以及大于 31 的天数。现在我想在选择期间忽略这些记录。我创建的存储过程不能正常工作,任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 我认为您需要向我们展示表格数据,或者至少是其中的代表性样本。
  • 表格有2列,请看下面
  • 不...不要在评论中发布数据。更新您的问题。
  • 该表有2列,open_date_txt字段在数据库中存储为varchar2(10)。请看下面名称 open_date_txt AA 2010-03-24 BB 2010-07-23 CC 2015-09-20 DD 1997-03-25 谢谢。
  • 顺便说一句:避免多次写出整个表达式的便捷方法是:SELECT days_open FROM ( SELECT TRUNC (SYSDATE) - TO_DATE (open_date_txt, 'yyyy-mm-dd') AS days_open FROM 'table' ) WHERE days_open &gt; 90 AND days_open &lt; 120

标签: oracle date


【解决方案1】:

该错误意味着表中至少有一行open_date_txt 中的值无法使用给定的格式字符串转换为DATE

查询将一直运行,直到遇到该行,然后抛出错误。当然,您永远不会在输出中看到导致错误的行,因此很难找到导致问题的值。

一种技术是逐行检查并引发一个更有用的异常来标识导致错误的条目。例如:

DECLARE
  d DATE;
BEGIN
  FOR x IN (SELECT name, open_date_txt FROM table) LOOP
    BEGIN
      d := TO_DATE( x.open_date_txt, 'yyyy-mm-dd');
    EXCEPTION
      WHEN others THEN
        raise_application_error(-20000, 'Error on name: ' || x.name, TRUE );
    END;
  END LOOP;
END;

您也可以修改它以打印出行的名称并继续,这样您就会发现是否有多行包含错误数据。

【讨论】:

  • 戴夫,我突然想到他可能有一些空白问题。如果是这样,那么使用 TRIM(open_date_txt) 可能会有所帮助。
  • 可能是。但是找到导致错误的数据不是比猜测更好吗?
  • 我同意。我会研究你的代码,以便在某个时候自己使用它。
  • @TimBiegeleisen 和 DaveCosta,我能够在表中找到错误数据。非常感谢您的宝贵时间。
  • 现在您还了解了为什么将日期存储为字符串是不好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多