【问题标题】:Getting Error - ORA-01858: a non-numeric character was found where a numeric was expected出现错误 - ORA-01858:在需要数字的地方发现了一个非数字字符
【发布时间】:2015-07-03 08:19:52
【问题描述】:

我在下面的 sql 中收到错误:

ORA-01858:在需要数字的地方发现了一个非数字字符

SELECT   c.contract_num,
         CASE
            WHEN   (  MAX (TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))
                    - MIN (TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')))
                 / COUNT (c.event_occurrence) < 32
            THEN
              'Monthly'
            WHEN       (  MAX (
                            TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))
                        - MIN (
                            TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')))
                     / COUNT (c.event_occurrence) >= 32
                 AND   (  MAX (
                            TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))
                        - MIN (
                            TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')))
                     / COUNT (c.event_occurrence) < 91
            THEN
              'Quarterley'
            ELSE
              'Yearly'
         END
FROM     ps_ca_bp_events c
GROUP BY c.contract_num;

【问题讨论】:

  • 您的 event_dt 列的数据类型是什么?另外,为什么要将日期转换为字符串并减去它们?目的是什么?如果要查找两个日期之间的天数,请考虑如果最大日期是 12 月 12 日,最小日期是同一年的 11 月 31 日,您可能会得到什么结果。如果他们在不同的年份呢?
  • event_dt 列是日期类型。
  • 如果已经是约会了,你为什么还要TO_DATE呢?!

标签: oracle


【解决方案1】:

您遇到的错误是因为您在已经是日期的列上执行 TO_DATE,并且您使用的格式掩码与您的 nls_date_format 参数 [1] 不同,或者是因为 event_occurrence 列包含不是数字的数据。

您需要 a) 更正您的查询,使其不在日期列上使用 TO_DATE,并且 b) 更正您的数据,如果 event_occurrence 应该只是数字。

并修复该列的数据类型以确保您只能存储数字。



[1] 当你这样做时,Oracle 会做什么:TO_DATE(date_column, non_default_format_mask) 是: TO_DATE(TO_CHAR(date_column, nls_date_format), non_default_format_mask)

一般情况下,默认的nls_date_format 参数设置为dd-MON-yy,因此在您的查询中,可能发生的情况是您的日期列被转换为格式为dd-MON-yy 的字符串,然后您将使用 MMDD 格式将其转回日期。字符串不是这种格式,所以会出错。

【讨论】:

  • 我刚刚删除了 TO_DATE() 函数,查询工作正常...非常感谢您的及时回复...我真的很感谢你! :)
【解决方案2】:

出现此错误的原因不仅在于日期转换

当我们尝试传递日期而 varchar 是预期的时,可能会出现此错误

当我们尝试通过 varchar 而预期日期时。

当需要varchar 时使用to_char(sysdate,'YYYY-MM-DD')

【讨论】:

    【解决方案3】:

    我添加了TO_DATE,它解决了问题。

    修改前 - 由于以下情况,我收到此错误

    record_update_dt>='05-May-2017'
    

    修改后 - 添加to_date后,问题得到解决。

    record_update_dt>=to_date('05-May-2017','DD-Mon-YYYY')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多