具有条件的字符串到日期转换 - postgresql

时间:2013-11-30 12:11:43

标签: postgresql date trim

我有一个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

我的问题是如何分隔batchnameexpiry date并仅显示截止日期为>now+120天的说明

感谢,

2 个答案:

答案 0 :(得分:1)

同意以前的评论,这应该规范化,为了从这些字符串中获取日期,你可以试试这个:

select to_date(substring(col1 from position('_' in col1) + 1), 'DD-MM-YY')
from tab1;

这会将第一个_之后的文本转换为日期。

sqlfiddle demo

答案 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