Преобразование в дату с несколькими возможными масками в Oracle - PullRequest
3 голосов
/ 18 декабря 2009

Так получилось, что мне нужно получить дату из колонки varchar2 в oracle, но она несовместима с форматированием. Некоторые поля могут иметь «2009.12.31», другие «2009/12/32 00:00:00». Есть ли какая-либо стандартная конструкция, которую я мог бы использовать, чтобы мне не пришлось проходить через

begin
  to_date(date, mask1)
exception
  begin
    to_date(date,mask2)
  exception
    ..
  end
end

блоки или предыдущий анализ строки даты для определения правильной маски? Что-то вроде to_date(date, mask1,mask2,..)?

Ответы [ 2 ]

4 голосов
/ 18 декабря 2009

Нет, но некоторые форматы дат Oracle «прощают» различия, например,

SQL> select to_date('2009.12.31','YYYY/MM/DD') from dual;

TO_DATE('20
-----------
31-DEC-2009

Так что это может уменьшить количество дел, которые вам нужно обработать. Я предлагаю вам написать функцию в соответствии с тем, о чем вы думали, чтобы ее можно было вызывать из всех мест в вашем коде, где вам нужно обрабатывать даты, подобные этой.

1 голос
/ 19 декабря 2009

Вам необходимо перечислить все возможные форматы, которые вы хотите поддерживать, - помните, что некоторые из них неоднозначны (например, «10-11-2009» 10 ноября или 11 октября?), Поэтому ваш код будет предпочтительнее одного над другим.

Как сказал Тони, некоторые форматы будут принимать различные входные данные, в основном в отношении анализа символов разделителя и пропущенных битов (например, «DD-MON-YYYY HH24: MI: SS» будет соответствовать «31 -DEC-2009»). 10:30:00 ', '31 / deC / 2009 10:30', '31 дек 2009').

Помимо этих упрощений, вам понадобится серия BEGIN (формат1), ИСКЛЮЧЕНИЕ, КОГДА ДРУГОЕ НАЧИНАЕТСЯ (format2), ИСКЛЮЧЕНИЕ, КОГДА ДРУГОЙ, ЧЕМ НАЧИНАЕТСЯ ....

...