Вы можете проверить, что строка соответствует формату даты следующим образом:
create or replace function is_CCYYMMDD
(p_str in varchar2)
return boolean
is
rv boolean;
dt date;
begin
begin
dt := to_date(p_str, 'YYYYMMDD');
dt := to_date('2000' || substr(p_str, 5), 'YYYYMMDD');
rv := true;
exception
when others then
rv := false;
end;
return rv;
end;
Первая to_date()
просто проверяет, что вся строка является допустимой датой.Вторая to_date()
проверяет, что вторая половина строки является допустимым комбинированием месяца и дня.Это отчасти касается @ MTO наблюдений о проблемах применения строгого формата, когда некоторые строки могут соответствовать более чем одному формату.
Обратите внимание, что вполне возможно иметь действительные даты, которые проходят этот тестнесмотря на двусмысленность, например, 20111012
в 'YYYYMMDD'
или 'DDMMYYYY'
?Невозможно быть уверенным, если вы не введете строгое форматирование даты во входном интерфейсе с помощью виджета выбора даты или отдельных полей ввода для года, месяца и дня.
почему вы передаете '2000' в этом запросе?
Вторая проверка подтверждает, что последние четыре символа действительны как месяц и день.Всякий раз, когда мы проводим такого рода тесты, мы сталкиваемся с проблемой високосных лет.Если мы просто применим to_date(str, 'MMDD')
, Oracle по умолчанию установит год для текущего года: ошибка 2018029
не является допустимой датой, даже если исходный ввод 20160229
действителен.Моя функция избегает этого, установив элемент year в 2000, который был високосным.
Кстати, если вы хотите использовать эту функцию в SQL, вам нужно изменить тип возвращаемого типа на varchar2 (Флаг Y / N) или число (1/0), потому что SQL не поддерживает Booolean.