将提取的文本字符串转换为字符串在 Postgres 中长度不同的日期
Converting extracted text string to date where string varies in length in 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'))
我收到错误 "date/time field value out of range: '12122018'"。
我认为问题是由以下一个或两个原因造成的:
由于我的正则表达式删除了所有非整数字符,物化视图中我当前正则表达式的结果字符串长度有所不同(例如 12212018 8222018 962018)。日期长度为 6、7 或 8 位数字。
因此,我还没有想出在 month/day/year 值之间插入分隔符的方法。
有没有办法在不更改正则表达式的情况下将这些输出字符串更改为日期格式?
如果没有,我如何更改正则表达式以提取这些值?
请记住,我在源文本中使用的日期格式为 12/1/2018,并且不考虑天数或月数中的前导 0。此外,在同样格式的文本中,目标日期之前还有另一个日期。
这是源文本的示例:
PLACEHOLDER TEXT FOR REDACTED STUFF BLAH BLAH BLAH
**** Loremipsum
11/28/2018 4: 21: 37 PM ****1 of 2 Facility Information Permit
Number: 12-34-56789 Name of Facility: Dolor sit amet-consectetur
Address: 123 Fake Street City, Zip: adipiscing elit12345 RESULT: sed
Do Eiusmod tempor: by 8: 00 AM Re-Inspection Date: 12/4/2018 Type: Blah-Type Stuff Etc: Dolor sit amet-consectetur...
"Re-Inspection Date: 12/4/2018" 就是我想要的。
我正在使用 Postgres 11。
您可以使用重复 {}
模式指定不同长度的整数
select to_date(substring(lower(content)
from 're-inspection date:\s*(\d{1,2}/\d{1,2}/\d{4})' ),'mm/dd/yyyy') from t
我想 Kaushik Nayak 是正确的。我用这个正则表达式得到了同样的结果,使用正向回顾 (?<= 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');
我有一个文本列的物化视图,它提取代表日期的一串数字。
实体化视图是使用以下函数创建的:
(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'))
我收到错误 "date/time field value out of range: '12122018'"。
我认为问题是由以下一个或两个原因造成的:
由于我的正则表达式删除了所有非整数字符,物化视图中我当前正则表达式的结果字符串长度有所不同(例如 12212018 8222018 962018)。日期长度为 6、7 或 8 位数字。
因此,我还没有想出在 month/day/year 值之间插入分隔符的方法。
有没有办法在不更改正则表达式的情况下将这些输出字符串更改为日期格式?
如果没有,我如何更改正则表达式以提取这些值?
请记住,我在源文本中使用的日期格式为 12/1/2018,并且不考虑天数或月数中的前导 0。此外,在同样格式的文本中,目标日期之前还有另一个日期。
这是源文本的示例:
PLACEHOLDER TEXT FOR REDACTED STUFF BLAH BLAH BLAH **** Loremipsum 11/28/2018 4: 21: 37 PM ****1 of 2 Facility Information Permit Number: 12-34-56789 Name of Facility: Dolor sit amet-consectetur Address: 123 Fake Street City, Zip: adipiscing elit12345 RESULT: sed Do Eiusmod tempor: by 8: 00 AM Re-Inspection Date: 12/4/2018 Type: Blah-Type Stuff Etc: Dolor sit amet-consectetur...
"Re-Inspection Date: 12/4/2018" 就是我想要的。
我正在使用 Postgres 11。
您可以使用重复 {}
模式指定不同长度的整数
select to_date(substring(lower(content)
from 're-inspection date:\s*(\d{1,2}/\d{1,2}/\d{4})' ),'mm/dd/yyyy') from t
我想 Kaushik Nayak 是正确的。我用这个正则表达式得到了同样的结果,使用正向回顾 (?<= 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');