Вы действительно должны хранить даты как фактические даты (или временные метки). Если у вас есть строки, представляющие даты, вам часто нужно будет их преобразовать, используя to_date (с указанным форматом, не полагаясь на форматы по умолчанию). Это действительно зависит от того, какие функции сравнения/даты вы хотите. Вы получаете ошибки, потому что вы нажимаете значение, которое не соответствует указанному вами формату. Это также является хорошей причиной для указания столбца как DATE для хранения дат. Например,
select to_date('123', 'MM-DD-YYYY') from dual;
выдает ORA-01861. Таким образом, у вас может быть 99,9% строк в виде ММ-ДД-ГГГГ, но 0,1% вызовут головные боли.
В любом случае, если вы очищаете эти строки, вы можете сделать гораздо больше, используя функции to_date и date. Например:
select
(last_day(to_date('02-05-2009', 'MM-DD-YYYY')) - to_date('01-15-1998', 'MM-DD-YYYY')) as days_between_dates
from dual;
Не забава сделать это со строками. Или, возможно, просто найти самую последнюю дату:
select greatest(to_date('02-05-2009', 'MM-DD-YYYY'), to_date('12-01-1988', 'MM-DD-YYYY')) from dual;
с помощью сравнения строк даст неправильный ответ:
select greatest('02-05-2009', '12-01-1988') from dual;
лишь несколько примеров, но гораздо лучше лечить даты как даты, а не строк.
Пожалуйста, покажите нам запрос, который генерирует ошибку и определения таблиц связанных таблиц. –