2013-08-23 217 views
0

在我的數據庫中,我們有一列保存XML格式的數據。而XML元素之一成立日期,看起來像這樣:Postgres - 從時間戳文本中刪除毫秒

substring(table.column from '<timestamp>(.*)</timestamp>') as "Time Stamp" 

但我有一個很難試圖用正則表達式:

<timestamp>2013-05-22 16:01:26.78 CDT</timestamp> 
<timestamp>2013-05-15 10:29:44.588 CDT</timestamp> 
<timestamp>2013-02-27 09:37:54.677 CST</timestamp> 

所以我使用提取<timestamp>之間的值刪除毫秒。

我要的是2013-02-27 09:37:54 CST

我不知道夠不夠正則表達式來過濾掉毫秒。

回答

0

不應該只是使用:

/<timestamp>[^\.]*.([^\s]*)\s.*<\/timestamp>/ 

辦呢?這是紅寶石正則表達式,順便說一句。

你想要的是 「< \時間戳>」, 「任何非週期字符」, 「 」 「任何非空白」, 「空間」, 「什麼」,「 < /時間戳>」

選擇「任何非空白」。 (在紅寶石parens)

希望有所幫助。不知道正則表達式有多少變化。有些像ruby和perl是相同的。 注意我已經逃過了一些字符 - 所以不喜歡timestamp標籤。

1

使用現有查詢,你可以把結果(注意TIMESTAMPTZ(0)):

SELECT substring(col1,'<timestamp>(.*)</timestamp>')::TIMESTAMPTZ(0) as "Time Stamp" 
FROM ... 
+0

謝謝你,但並沒有工作。我試過了TIMESTAMPTZ,它不包含CDT/CST時區。它只將時間戳轉換爲我當前的時區。例如2013-05-22 16:01:26.78 CDT在我施放後變成2013-05-22 14:01:26.78 CDT。 – cYn

+0

呃?這就是TIMESTAMPTZ所做的 - 它使用當前的'timezone'設置進行顯示。是你的問題,你*只*想要毫秒?或者你的意思是你希望TIMESTAMP顯示在* only *表中數據的CDT/CST tz中? – bma

+0

哦,我很抱歉!我錯誤地寫了我的問題。我的意思是我想刪除毫秒。 – cYn