Поскольку вы говорите, что у вас нет доступа к базе данных, я предполагаю, что вы не можете создать какие-либо функции, которые могли бы помочь вам в этом, и что вы можете только выполнять запросы?
Если это так, то следующий код должен получить большую часть того, что вам нужно, с учетом следующих предостережений:
1) Сохраненный формат даты, который вы хотите оценить, - «мм / дд / гггг». Если это не так, то вы можете изменить код в соответствии с вашим форматом.
2) База данных не содержит недопустимых дат, таких как 30 февраля.
Сначала я создал свою тестовую таблицу и тестовые данные:
create table test ( x number, sdate varchar2(20));
insert into test values (1, null);
insert into test values (2, '01/01/1999');
insert into test values (3, '1999/01/01');
insert into test values (4, '01-01-1999');
insert into test values (5, '01/01-1999');
insert into test values (6, '01-01/1999');
insert into test values (7, '12/31/1999');
insert into test values (8, '31/12/1999');
commit;
Теперь запрос:
WITH dates AS (
SELECT x
, sdate
, substr(sdate,1,2) as mm
, substr(sdate,4,2) as dd
, substr(sdate,7,4) as yyyy
FROM test
WHERE ( substr(sdate,1,2) IS NOT NAN -- make sure the first 2 characters are digits
AND to_number(substr(sdate,1,2)) between 1 and 12 -- and are between 0 and 12
AND substr(sdate,3,1) = '/' -- make sure the next character is a '/'
AND substr(sdate,4,2) IS NOT NAN -- make sure the next 2 are digits
AND to_number(substr(sdate,4,2)) between 1 and 31 -- and are between 0 and 31
AND substr(sdate,6,1) = '/' -- make sure the next character is a '/'
AND substr(sdate,7,4) IS NOT NAN -- make sure the next 4 are digits
AND to_number(substr(sdate,7,4)) between 1 and 9999 -- and are between 1 and 9999
)
)
SELECT x, sdate
FROM dates
WHERE to_date(mm||'/'||dd||'/'||yyyy,'mm/dd/yyyy') <= to_date('08/01/1999','mm/dd/yyyy');
И мои результаты:
X SDATE
- ----------
2 01/01/1999
Оператор WITH выполнит большую часть проверки, чтобы убедиться, что значения sdate, по крайней мере, имеют правильный формат. Мне приходилось прерывать каждую единицу времени месяц / день / год, чтобы выполнить оценку to_date, потому что я все еще получал ошибку недопустимого месяца, когда выполнял to_date в sdate.
Надеюсь, это поможет.