正如你已經想通了自己的時區沒有在所有Postgres的日期/時間類型,甚至不timestamptz
保存。它的角色分別只是一個輸入修飾符或輸出修飾符。只有值(時間點)被保存。在這個相關答案充足的細節:
因此,如果您想保留的輸入字符串的一部分,你必須從字符串中提取並保存自己吧。我會用一個表,如:
CREATE TABLE tstz
...
, ts timestamp -- without time zone
, tz text
)
tz
,是text
,可以容納一個數字偏移以及時區縮寫,或時區名。
難點在於根據解析器遵循的所有各種規則提取時區部分,並且不會輕易破壞。 不用做你自己的程序,而是讓解析器完成工作。考慮這個演示:
WITH ts_literals (tstz) AS (
VALUES ('2013-11-28 23:09:11.761166+03'::text)
,('2013-11-28 23:09:11.761166 CET')
,('2013-11-28 23:09:11.761166 America/New_York')
)
SELECT tstz
,tstz::timestamp AS ts
,right(tstz, -1 * length(tstz::timestamp::text)) AS tz
FROM ts_literals;
SQL Fiddle.
作品帶或不帶日期和時間之間的T
。關鍵邏輯如下:
right(tstz, -1 * length(tstz::timestamp::text)) AS tz
在修剪解析器標識爲日期/時間分量的長度後,取出時間戳字符串的剩餘部分。這依賴於輸入是,當你說:
驗證ISO8601串
是否可以將偏移量存儲在一個單獨的列中,以便您不受Postgres的擺佈? – tadman
@tadman Ha。試圖將其轉換爲一列。似乎並不像一件不合理的事情。 – markdsievers
什麼是數據源?一個字符串文字?還是另一列 - 什麼類型的? –