как извлечь дату из строки в sql oracle 9i

У меня есть объяснение столбца (VARCHAR2) в таблице:

No| Explanation  
1 | Shipment of cabbage by agreement 29.04.2019 TAX Free  
2 | Payment for screws (01.04.19) Tax: 13.55 %  
3 | For reserch by deal dated 01.01.2015 Tax free  
4 | Tax payment for the may 2019 

Мне нужен запрос, который ответит: «Есть ли в записи дата в какой-либо форме?» Да/Нет для каждой записи. Возможно ли это на Oracle 9i?

Я пробовал некоторые решения. Но столкнулся с проблемой:

«ORA-01858: вместо числового символа был найден нечисловой».

Теперь я не совсем понимаю, где в поле будет метка даты.

select to_char(to_date(EXPLANATION, 'DD.MM.YYYY')) from PAYMENTDOC


person Rasinger    schedule 28.05.2019    source источник
comment
Вам нужно извлечь часть Explanation, содержащую строку даты, например, из значения Shipment of cabbage by agreement 29.04.2019 TAX Free вам нужно извлечь 29.04.2019 и отправить эту строку в функцию to_date(). Знаете ли вы, как извлечь соответствующую часть значения столбца? Также из этого значения: Tax payment for the may 2019 вы должны извлечь may 2019?   -  person Abra    schedule 28.05.2019
comment
Довольно странное требование. Как быть с сообщениями вроде «Уплата налога за текущий год»?   -  person Wernfried Domscheit    schedule 28.05.2019
comment
Знаете ли вы, как извлечь соответствующую часть значения столбца? Здесь я сталкиваюсь с проблемой. Это может быть везде в поле. Как быть с сообщениями вроде «Уплата налога за текущий год»? Я знаю, чем это может быть: «ДД.ММ.ГГГГ», «ДД.ММ.ГГ» и «буквальный месяц ГГГГ». Это могут быть и другие странные варианты, но я перечислил 80% полей.   -  person Rasinger    schedule 28.05.2019
comment
@Rasinger есть ли не более одной информации о дате в каждой строке для столбца объяснения?   -  person Barbaros Özhan    schedule 28.05.2019
comment
Может содержать более одной даты.   -  person Rasinger    schedule 28.05.2019


Ответы (1)


Вы можете сделать это с помощью регулярного выражения. Попробуйте ниже код:

  select No, Explanation, 
  case when regexp_instr(Explanation,'\d{2}.\d{2}.\d{2}')!=1 then 
              'Y'
              when regexp_instr(Explanation,'\d{2}.\d{2}.\d{4}')!=1 then
              'Y'
              when REGEXP_instr(Explanation, '(January|February|March|April|May|June|July|August|September|October|November|December) [0-9]{4}')!=1 then
              'Y'
             END Does_entry_have_a_date_in_some_form_in_it
  from table_name;

Выход :

No| Explanation                                          | Does_entry_have_a_date_in_some_form_in_it
1 | Shipment of cabbage by agreement 29.04.2019 TAX Free | Y
2 | Payment for screws (01.04.19) Tax: 13.55 %           | Y
3 | For reserch by deal dated 01.01.2015 Tax free        | Y
4 | Tax payment for the may 2019                         | Y
person Pranav Sri    schedule 28.05.2019
comment
К сожалению, в Oracle 9i нет регулярных выражений ( - person Rasinger; 28.05.2019
comment
Поэтому я нашел способ использовать (regexp_instr) как функцию — oracleappstech-vinoth.blogspot.com/2012/03/. Теперь это работает. - person Rasinger; 29.05.2019