Преобразование извлеченной текстовой строки в дату, где длина строки изменяется в Postgres - PullRequest
0 голосов
/ 01 февраля 2019

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

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

(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.2008 и также не учитываетведущие 0 в днях или месяцах.Кроме того, есть другая дата, предшествующая целевой дате в тексте, отформатированном таким же образом.

Вот пример исходного текста:

PLACEHOLDER TEXT ДЛЯ УДАЛЕННОГО ПЕРСОНАЛА BLAH BLAH BLAH**** Loremipsum 28.11.2008 16:21:37 **** 1 из 2 Номер разрешения на получение информации об объекте: 12-34-56789 Наименование объекта: Dolor sit amet-consectetur Адрес: 123 Fake Street City, Zip: adipiscing elit12345 РЕЗУЛЬТАТ: sed Do Eiusmod темп: до 8:00 утра Дата повторного осмотра: 12/4/2018 Тип: Материал типа бла и т. д.: Dolor sit amet-consectetur ...

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

Я на Postgres 11.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

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

SELECT to_date(substring('string'
            from '(?<=Re-Inspection Date: )[0-9]*/{1}[0-9]*/{1}[0-9]*'), 'mm/dd/yyyy');
0 голосов
/ 01 февраля 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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...