簡體   English   中英

ORA-01858: 在需要數字的地方發現了一個非數字字符(時間戳、解碼)

[英]ORA-01858: a non-numeric character was found where a numeric was expected (timestamp, decode)

我收到此錯誤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'))

我可以建議這樣的東西嗎?

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)

這就是你所要求的,我相信:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM