oracle sql - не числовой символ был найден там, где ожидалось числовое значение
Я знаю, что есть множество сообщений об исправлении этой ошибки, но я просто не понимаю этого!
val_strg1
значение 01.04.2016
, Я хочу использовать это, а не показывать строки, где эта дата старше текущей даты (т.е. and trunc(sysdate) < dv.val_strg1
).
Но, хотя я использовал формат to_date, я все еще получаю a non-numeric character was found where a numeric was expected
ошибка?
Я пробовал несколько форматов to_date;
to_date(val_strg1,'DDMMYYYY')
, to_date(val_strg1,'DD-MM-YYYY')
Следующее дает мне 'not a valid month'
ошибка?
to_date(val_strg1,'DD-MON-YYYY')
Мой сценарий...
select val_strg, val_strg1, to_date(val_strg1,'DDMMYYYY')
from sd_domainval_org
where name = 'HYPERCARE_CUNR'
order by sort_no
Как я могу использовать val_strg1
как свидание?
4 ответа
Кажется, вы используете текстовый столбец (например, VARCHAR2) для даты. И вы говорите, что
to_date(val_strg1, 'DD.MM.YYYY')
приводит к ошибке. Таким образом, у вас есть значение в этом столбце, которое не соответствует шаблону. Вот запрос для поиска таких недействительных записей:
select *
from domainval
where name = 'HYPERCARE_CUNR'
and not regexp_like(val_strg1, '^[[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{4}$');
Затем вы можете исправить неправильные записи, но лучшим решением, конечно, было бы вообще не хранить даты в строковых столбцах. Вместо этого используйте столбцы даты, чтобы не было таких проблем.
В этом случае вы должны настроить форматирующую строку, чтобы она точно соответствовала вашей структуре даты
select val_strg, val_strg1, to_date(val_strg1,'DD.MM.YYYY')
from sd_domainval_org
where name = 'HYPERCARE_CUNR'
order by sort_no;
Если ваша строковая дата val_strg1 имеет форму "ДД.ММ.ГГГГ" (то есть "01.04.2016"), то вы должны использовать to_date(val_strg1, "ДД.ММ.ГГГГ");
Например: выберите to_date('01.04.2016',' ДД.ММ.ГГГГ) из двойного;
Если у вас снова возникают ошибки, возможно, у вас есть строка в наборе записей, которая не имеет допустимой формы для функции to_date (проверьте значения в столбце val_strg1).
До свидания,
Игорь
Я нашел ответ...
and trunc(sysdate) < to_date(regexp_substr(val_strg1, '^[[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{4}$'),'DD.MM.YYYY')
... кажется, работает нормально.