2011-03-18 237 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(...)事物放入視圖中以使其他查詢更容易。

從長遠來看,你應該真的(真的)試圖解決這個問題的數據模型。

相關問題