ORA-01858: обнаружен нечисловой символ c там, где ожидалось число c (временная метка, декодирование) - PullRequest
0 голосов
/ 16 июня 2020

Я получаю эту ошибку ORA-01858: a non-numeric character was found where a numeric was expected. Если я удалю вторую строку в своем коде, я не получу сообщения об ошибке, поэтому мне интересно, связана ли проблема с DECODE или типом данных переменной TIME_P, который является отметкой времени.

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

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Это то, о чем вы просите, я считаю:

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

Поскольку вы упомянули «Первый аргумент является необязательным параметром», я ввел выражение «YOUR_FIRST_PARAMETER_HER», чтобы отметить, что вы положи это там.

Ваша ошибка возникла из-за формата, который вы ввели ('YYYY-MM-DD'), потому что правильный формат - 'DD-MON-YYYY' Кроме того, перед преобразованием вам нужно будет обрезать c это значение временной метки ...

Здесь вы можете увидеть ошибки, которые могут возникнуть, если вы не используете правильный формат и не используете trun c: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=83cca74815a323bc72283adeb7396617

1 голос
/ 16 июня 2020

Могу я предложить что-то подобное вместо этого?

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...