Regex 在postgres表列中获取日期值并检查其是否大于今天的日期

Regex 在postgres表列中获取日期值并检查其是否大于今天的日期,regex,postgresql,Regex,Postgresql,我有一个名为clients的Postgres表。“名称”列包含某些值,例如 test23233[9876654322014-02-18] 在值的末尾是一个日期,我需要比较这个日期,并返回这个特定日期小于今天的所有记录 我试过了 select id,name FROM clients where name ~ '(\d{4}\-\d{1,2}\-\d{1,2})'; 但这不会返回任何值。我将如何实现我想要的结果?为此使用正则表达式将非常困难。是否可以更改模式和数据以将名称(无论第二个值是什么)和

我有一个名为clients的Postgres表。“名称”列包含某些值,例如

test23233[9876654322014-02-18]

在值的末尾是一个日期,我需要比较这个日期,并返回这个特定日期小于今天的所有记录

我试过了

select id,name FROM clients where name ~ '(\d{4}\-\d{1,2}\-\d{1,2})';

但这不会返回任何值。我将如何实现我想要的结果?

为此使用正则表达式将非常困难。是否可以更改模式和数据以将名称(无论第二个值是什么)和时间戳分隔为单独的列?这将更符合逻辑,更不容易出错,并且更快

否则,我怀疑您必须使用某种解析(可能是正则表达式)来提取日期,然后将其转换为Postgres日期,然后将其与当前时间进行比较。。。每一行。哎呀


编辑:事实上,还没那么糟。。。因为您的日期是以一种排序友好的方式存储的,所以您可以使用正则表达式或任何其他方法进行提取,只需与今天日期的字符串表示形式进行顺序比较,而不必对每一行执行任何日期转换。但它仍然很难看,也不能证明日期不是2011-99-99。如果您可以更合理地存储数据,请执行。

我通过执行类似的操作解决了我的问题

select id,substring(name,'[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}'),name FROM clients where substring(name,'[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}') > '2011-03-18';

这可能不是最好的做法,但确实有效。但是,如果数据总是以这种方式存储,即在逗号之后,我将不使用正则表达式,而是提取日期部分并将其转换为适当的日期类型,这将是一个更好的建议

SELECT * FROM the_table WHERE to_date(substring(name, strpos(name, ',') + 1, 10), 'yyyy-mm-dd') < current_date 你可能想把它写下来。。。将对象添加到视图中,以便于其他查询


从长远来看,您应该真正尝试修复该数据模型

不幸的是,无法更改模式。不使用正则表达式会更容易,但不幸的是,我无法修改schema@Roland:请尝试更改架构。像那样存储数据是在乞求数据和性能的问题!你需要这样做一次还是几次?换句话说,今天的价值是否不变?另外,尝试从客户端选择id,name,其中name ~$?p\d{4}-\d{1,2}-\d{1,2}$$;然后看看这是否会返回任何结果。请注意,如果您的月/日实际上可以存储为一个位数,例如2011-3-5,那么这将不起作用。您需要强制执行两位数,即同一日期的2011-03-05。然后您可以将正则表达式更改为使用{2}而不是{1,2}。@Jon-是的,您的权利,没有朝那个方向想,谢谢您的建议