将提取的文本字符串转换为 Postgres 中字符串长度不同的日期

Posted

技术标签:

【中文标题】将提取的文本字符串转换为 Postgres 中字符串长度不同的日期【英文标题】:Converting extracted text string to date where string varies in length in Postgres 【发布时间】:2019-06-25 16:24:04 【问题描述】:

我有一个文本列的物化视图,它提取代表日期的一串数字。

物化视图是使用以下函数创建的:

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

并以 MMDDYYYY except 的格式输出一个文本字符串,它考虑个位数月份和日期的前导零。

当我尝试使用“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 位。

因此,我还没有想出在月/日/年值之间插入分隔符的方法。

有没有办法在不更改我的正则表达式的情况下将这些输出字符串更改为日期格式?

如果没有,我该如何更改我的正则表达式以提取这些值?

请记住,我在源文本中的日期格式为 2018 年 12 月 1 日,并且不包括以天或月为单位的前导 0。此外,在以相同方式格式化的文本中,在目标日期之前还有另一个日期。

这里是源文本的示例:

已编辑内容的占位符文本 BLAH BLAH BLAH **** 洛雷米普苏姆 2018 年 11 月 28 日下午 4:21:37 ****1 of 2 设施信息许可证 号码:12-34-56789 设施名称:Dolor sit amet-consectetur 地址:123 Fake Street City,邮编:adipiscing elit12345 结果:sed 做 Eiusmod 时间:上午 8:00 重新检查日期:12/4/2018 类型:Blah-Type Stuff 等:Dolor sit amet-consectetur...

“重新检查日期:2018 年 12 月 4 日”是我所追求的。

我在 Postgres 11 上。

【问题讨论】:

【参考方案1】:

我猜 Kaushik Nayak 是正确的。我使用这个正则表达式得到了同样的结果,它使用了一个积极的后视 (? 分隔任意数量的整数 [0-9]*

SELECT to_date(substring('string'
            from '(?<=Re-Inspection Date: )[0-9]*/1[0-9]*/1[0-9]*'), 'mm/dd/yyyy');

【讨论】:

很高兴能够提供帮助!【参考方案2】:

您可以使用重复 模式指定不同长度的整数

select to_date(substring(lower(content) 
from  're-inspection date:\s*(\d1,2/\d1,2/\d4)' ),'mm/dd/yyyy') from t

Demo

【讨论】:

以上是关于将提取的文本字符串转换为 Postgres 中字符串长度不同的日期的主要内容,如果未能解决你的问题,请参考以下文章

在Postgres中将十六进制字符串转换为bigint [重复]

AWS Glue 将字符串值从 postgres 转换为 json 数组

c语言中,如何将字符串数组中的52提取出来,并转换为int类型

Json 将字符串中的 & 转换为 \u0026

PHP提取富文本字符串中的纯文本,并进行进行截取

如何将mm:ss时间字符串转换为秒整数(postgres / liquibase)