【问题标题】:Converting extracted text string to date where string varies in length in Postgres将提取的文本字符串转换为 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 上。

【问题讨论】:

    标签: regex postgresql materialized-views regexp-replace to-date


    【解决方案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*(\d{1,2}/\d{1,2}/\d{4})' ),'mm/dd/yyyy') from t
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 2012-07-30
      • 2018-10-22
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多