【问题标题】:ORA-01858: a non-numeric character was found where a numeric was expected (timestamp, decode)ORA-01858: 在需要数字的地方发现了一个非数字字符(时间戳、解码)
【发布时间】:2020-06-16 19:33:37
【问题描述】:

我收到此错误ORA-01858: a non-numeric character was found where a numeric was expected。如果我删除代码中的第二行,我不会收到错误消息,所以我想知道问题是否与 TIME_P 变量的 DECODE 或数据类型(即时间戳)有关。

TRUNC(TIME_P) >= TO_DATE('2009-01-01', 'YYYY-MM-DD') AND
TIME_P <= DECODE('2010-01-01', NOW, SYSDATE, TO_DATE('YYYY-MM-DD'))

【问题讨论】:

  • 请说明您要实现的逻辑。比如NOW是什么?
  • 现在应该返回当前日期
  • 。 . decode() 的目的是什么? sysdate 也是当前日期。
  • 在您提供的代码中,您在第一个日期 '2009-01-01 之后缺少一个单引号......但我不相信你得到的错误是因为这个......正如您在此处看到的:dbfiddle.uk/… 如果现在只是一列,那么您的查询就可以了。所以......就像戈登问的那样,现在是什么?
  • 你能解释一下第二行的逻辑吗? ——你想达到什么目标? SYSDATE 等价于 NOW

标签: sql oracle


【解决方案1】:

我相信这就是你所要求的:

DECODE(YOUR_FIRST_PARAMETER_HER, '2010-01-01', SYSDATE, TO_DATE(TRUNC(TIME_P), 'DD-MON-YYYY'))

正如您提到的“第一个 arg 是可选参数”,所以我输入了“YOUR_FIRST_PARAMETER_HER”表达式,只是为了提醒您,您将把它放在那里。

您的错误是由于您输入的格式('YYYY-MM-DD') 而发生的,因为正确的格式是'DD-MON-YYYY' 此外,在转换之前,您需要截断该时间戳值...

这里可以看到如果不使用正确的格式以及不使用trunc会出现的错误:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=83cca74815a323bc72283adeb7396617

【讨论】:

    【解决方案2】:

    我可以建议这样的东西吗?

    TIME_P >= DATE '2009-01-01' AND
    TIME_P < (CASE WHEN NOW = '2010-01-01' THEN DATE '2010-01-01' ELSE SYSDATE END)
    

    这使用日期文字,case 而不是 decode()case 是标准 SQL)。最初的trunc() 也是多余的。

    第二行对我来说真的没有意义。如果您只想要不在未来的日期,那么:

    TIME_P >= DATE '2009-01-01' AND
    TIME_P < sysdate
    

    或者如果你想传入一个参数并使用它来代替 sysdate:

    TIME_P >= DATE '2009-01-01' AND
    TIME_P < COALESCE(:parameter, sysdate)
    

    【讨论】:

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