ora-01858:在需要数字的地方发现了一个非数字字符(时间戳,解码)

3j86kqsm  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(456)

我得到了这个错误 ORA-01858: a non-numeric character was found where a numeric was expected . 如果我删除代码中的第二行,我就不会得到错误,所以我想知道问题是否与timestamp变量的解码或数据类型有关。

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'))
qhhrdooz

qhhrdooz1#

这就是你想要的我相信:

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

正如您提到的“first arg is optional param”,所以我输入了“your\u first参数”表达式,只是想提醒您,您将把它放在那里。
由于您输入的格式,因此发生了错误 ('YYYY-MM-DD') 因为正确的格式是 'DD-MON-YYYY' 此外,在转换之前,您需要trunc该时间戳值。。。
如果不使用正确的格式和trunc,您可以在这里看到将发生的错误:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=83cca74815a323bc72283adeb7396617

ep6jt1vc

ep6jt1vc2#

我可以建议这样的吗?

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)

相关问题