我有一个coloumnname description
description //character varying
LZ000834_28-02-14
LZ000834_28-02-14
LA20683_30-04-15
LA20683_30-04-15
LA20300_31-01-15
LA20300_31-01-15
LA20264_31-01-15
LA20264_31-01-15
LAN2078_31-03-15
LAN2078_31-03-15
L2Z82736_31_03_2015 //this is rare case but this kind of dates also possible
此处的说明意味着batchname_expirydate
我的问题是如何分隔batchname
和expiry date
并仅显示截止日期为>now+120
天的说明
感谢,
答案 0 :(得分:1)
同意以前的评论,这应该规范化,为了从这些字符串中获取日期,你可以试试这个:
select to_date(substring(col1 from position('_' in col1) + 1), 'DD-MM-YY')
from tab1;
这会将第一个_
之后的文本转换为日期。
答案 1 :(得分:0)
正确的解决方案是规范化您的数据,在表格中添加一列,其中包含每个产品的到期日期,为该列添加索引并相应地进行选择。
快速方法是使用正则表达式
with product_dates AS (
select description, case when val[4]::int > 1900 then
(val[4]||'-'||val[3]||'-'||val[2])::date else
((val[4]::int+2000)||'-'||val[3]||'-'||val[2])::date end as expir_date
from (
select description,regexp_matches(description, '([a-zA-Z0-9]+)_([0-9]+)[-_]([0-9]+)[-_]([0-9]+)') as val
from your_table_name
) a
), expiring_dates AS (
select description from product_dates where expir_date > now() + '120 days'
)
select description from expiring_dates
我确信上面的内容可以稍微优化一下,但这不是重点,不是吗?不要忘记使用您的真实姓名更改your_table_name