2011-03-18 25 views
0

我有一个Postgres的表称为客户端。名称列包含某些值,例如。获得一个Postgres的表列日期值,并检查它是否大于今天的日期

test23233 [987665432,2014-02-18]

在值的末尾是一个日期,我需要在那里这个日子是比今天年轻的比较这个日期,并返回所有记录

我试图

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

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

+0

你需要做一次或几次? (为了话,是 “今天” 的恒定的或不是值?)另外,尝试选择'ID,名称来自客户端的其中name〜$$ \ d {4}(P 2) - \ d {1,2} - \ d {1,2} $$;'看看是否会返回任何结果。 – 2011-03-18 07:43:15

+0

@Tim - 几次 – Roland 2011-03-18 07:49:48

回答

0

我解决我的问题,做类似的事情,以

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'; 

可能不是最好的做法,但它的工作原理。但开到更好的建议

+1

请注意,如果您的月/日*实际*可能被存储在一个数字中,这将不会奏效。 2011-3-5。您需要强制执行两位数字,即2011-03-05为同一日期。然后你可以改变你的正则表达式来使用'{2}'而不是'{1,2}''。 – 2011-03-18 07:55:47

+0

@Jon - 是的你的权利,没有想到在这个方向,谢谢你的建议 – Roland 2011-03-18 08:05:47

0

使用正则表达式,这将是非常困难的。是否有可能更改模式和数据来分隔名称,无论第二个值是什么,以及将时间戳分成不同的列?这将更符合逻辑,不易出错,并且速度更快。

否则,我怀疑你将不得不使用某种解析的(可能是一个正则表达式)提取日期,然后将其转换为一个Postgres日期,然后比较与当前时间......每一个单排。伊克。

编辑:其实,这不是相当坏...因为您日期存储在一种友好的方式,它可能是你可以做的提取(是否与正则表达式或其他任何东西),只是做与当前日期的字符串表示形式进行序号比较,而不必为每行实际执行任何日期转换。尽管如此,它仍然很难看,并且没有验证日期不是(比如说)2011-99-99。如果可以可能存储数据更明智,做。

+0

不幸的是无法更改模式。这会更容易不做正则表达式的方式,但不幸的是我不能修改架构 – Roland 2011-03-18 07:36:51

+0

@Roland:试图改变架构。像这样存储数据就是为了解决问题(数据和性能!) – 2011-03-18 07:53:05

1

如果数据总是以这种方式存储(即逗号后),我不会用正则表达式,但提取的日期部分并将其转换为一个适当的日期类型。

 
SELECT * 
FROM the_table 
WHERE to_date(substring(name, strpos(name, ',') + 1, 10), 'yyyy-mm-dd') < current_date 

您可能希望将该to_date(...)事物放入视图中以使其他查询更容易。

从长远来看,你应该真的(真的)试图解决这个问题的数据模型。

相关问题