:: Не фоксом единым
Oracle. Проверка корректности формата дат
Pekpytep

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Всем привет.
Возникла необходимость проверки даты при импорте из csv в БД. Изобрел вот такой велосипед с квадратными колесами:
IF REGEXP_LIKE(v_employees(idx).birth_date, '%.%') THEN
v_employees(idx).birth_date := to_char(TO_DATE(v_employees(idx).birth_date, 'DD.MM.YYYY'));
ELSIF REGEXP_LIKE(v_employees(idx).birth_date, '%/%') THEN
v_employees(idx).birth_date := to_char(TO_DATE(v_employees(idx).birth_date, 'MM/DD/YYYY'));
END IF;
BEGIN
v_date := CAST(v_employees(idx).birth_date AS DATE);
EXCEPTION
WHEN OTHERS THEN
v_employees(idx).birth_date := NULL;
END;
IF v_employees(idx).birth_date IS NULL
THEN v_employees(idx).is_correct = 0;
END IF;

Есть ли более простой способ проверить дату неизвестного формата в текстовом виде на корректность?
Ratings: 0 negative/0 positive
Re: Oracle. Проверка корректности формата дат
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Pekpytep
проверить дату неизвестного формата в текстовом виде на корректность?
Строку неизвестного формата проверить невозможно в принципе. Как и трактовать её - что как дату, что как число...
Если ТОЧНО известно что могут быть такой, такой и вот такой форматы - это другое дело. Если форматы непротиворечивы то можно пытаться их разбирать.
В частности формат DD-MM-YYYY будет противоречить формату MM-DD-YYYY. Если в исходных данных может быть и то и это, то трактовать "как дату" такое нельзя - это гарантированно будет приводить к ошибкам. Не говоря уж о разновидностях с 2-значными годами...

P.S. В REGEXP_LIKE используется синтаксис регулярок, а не SQL-ного LIKE. Скажем для указанных двух форматов можно попробовать регулярки
'[0-3]\d\.[0-1]\d\.[1-2]\d{3}'
и соответственно
'[0-1]\d/[0-3]\d/[1-2]\d{3}'

Конечно же от 32 мая или от 13-го месяца, не говоря уж о 29 февраля в невисокосном году это не убережёт, поэтому to_date() надо и в этих случаях внутри блока с обработчиком ошибок применять.
Года я явно ограничил 1*** и 2***-ми. Можно и строже сделать, ограничив лишь 19** и 20**-ми.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Oracle. Проверка корректности формата дат
Pekpytep

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Igor Korolyov
Строку неизвестного формата проверить невозможно в принципе. Как и трактовать её
В принципе, я сторонник стандартизации файлообмена между подразделениями и организациями, но мое непосредственное начальство, к сожалению, считает иначе.

Igor Korolyov
Если ТОЧНО известно что могут быть такой, такой и вот такой форматы - это другое дело.
Не хочу лепить разбор всех мыслимых и немыслимых возможных форматов, а утвержденного формата пока нет и не факт что будет. Этим кодом я принимаю два наиболее распространенных формата даты, иначе считаю дату некорректной и пусть они тогда сами себе будут злобными буратинами.

Igor Korolyov
В REGEXP_LIKE используется синтаксис регулярок, а не SQL-ного LIKE.
Да, стормозил. Подразумевал
v_employees(idx).birth_date := case when v_employees(idx).birth_date LIKE '%.%' THEN to_char(TO_DATE(v_employees(idx).birth_date, 'DD.MM.YYYY')) ...
Через регексп тоже неплохо получилось, спасибо. Жаль что нет какой-нибудь интегрированной plsql функции для проверки корректности дат.
Ratings: 0 negative/0 positive
Re: Oracle. Проверка корректности формата дат
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну функция конвертации как раз и выполняет проверку корректности
Правда между 2 января и 1 февраля записанными в разных форматах она, естественно, никак не сможет разобраться. Это я и имел в виду - 31.01 никогда "по ошибке" не превратится в 1 число 31-го месяца, а вот 01.02 - запросто.
Поэтому так опасно принимать на себя обязательства по разбору откровенного мусора. Кто будет крайним когда вылезет вот такая ерунда?


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика