Преобразование извлеченной текстовой строки в дату, где длина строки варьируется в Postgres

У меня есть материализованное представление текстового столбца, извлекающего строку чисел, представляющую дату.

Материализованное представление создается с помощью следующей функции:

(regexp_replace(left(substring(lower(replace(content,' ','_')) from 're-inspection_date:_(.*)_'),10),'\D','','g'))

И выводит текстовую строку в формате MMDDYYYY за исключением того, что она не учитывает начальные нули для однозначных месяцев и дней.

Когда я пытаюсь использовать функцию "to_date", указав формат MMDDYYYY, используя следующее:

(to_date(regexp_replace(left(substring(lower(replace(content,' ','_')) from 're-inspection_date:_(.*)_'),10),'\D','','g'),'MMDDYYYY'))

Я получаю сообщение об ошибке «Значение поля даты / времени вне допустимого диапазона: '12122018'».

Я считаю, что проблема возникла по одной или обеим из следующих причин:

  • Результирующие строки из моего текущего регулярного выражения в материализованном представлении различаются по длине (например, 12212018 8222018 962018) из-за того, что мое регулярное выражение удаляет все нецелочисленные символы. Даты состоят из 6, 7 или 8 цифр.

  • В результате я еще не смог придумать способ вставить разделитель между значениями месяца / дня / года.

Есть ли способ изменить формат этих выходных строк на формат даты без изменения моего регулярного выражения?

Если нет, как я могу изменить свое регулярное выражение для извлечения этих значений?

Имейте в виду, что дата, которую я ищу в исходном тексте, отформатирована как 01.12.2018 и также не учитывает ведущие 0 в днях или месяцах. Кроме того, в тексте, отформатированном таким же образом, есть еще одна дата, предшествующая целевой дате.

Вот образец исходного текста:

ТЕКСТ МЕСТОПОЛОЖЕНИЯ ОТРЕДАКТИРОВАННЫХ ПЕРСОНАЛОВ BLAH BLAH BLAH **** Loremipsum 28.11.2018 4: 21: 37 PM **** 1 из 2 Номер разрешения на информацию об объекте: 12-34-56789 Название объекта: Dolor sit amet-conctetur Адрес: 123 Fake Street City, почтовый индекс: adipiscing elit12345 РЕЗУЛЬТАТ: sed Do Eiusmod tempor: до 8:00 AM Дата повторной проверки: 12/4/2018 Тип: Blah-Type Stuff Etc: Dolor sit amet-conctetur ...

Где «Дата повторной проверки: 12/4/2018» - это то, что мне нужно.

Я использую Postgres 11.


person gulfy    schedule 01.02.2019    source источник


Ответы (2)


Думаю, Кошик Наяк прав. Я получаю то же самое с этим регулярным выражением, используя положительный просмотр назад (? ‹= Re-Inspection Date :) и позволяя использовать любое количество целых чисел [0-9] *, разделенных одной косой чертой / {1}

SELECT to_date(substring('string'
            from '(?<=Re-Inspection Date: )[0-9]*/{1}[0-9]*/{1}[0-9]*'), 'mm/dd/yyyy');
person Humpelstielzchen    schedule 01.02.2019
comment
рад возможности помочь! - person Humpelstielzchen; 01.02.2019

Вы можете указать различную длину целых чисел, используя шаблон повторения {}

select to_date(substring(lower(content) 
from  're-inspection date:\s*(\d{1,2}/\d{1,2}/\d{4})' ),'mm/dd/yyyy') from t

Демо

person Kaushik Nayak    schedule 01.02.2019