Som du allerede selv har fundet ud af, er tidszonen gemmes slet ikke med Postgres dato/tidstyper, ikke engang med timestamptz
. Dens rolle er kun henholdsvis en inputmodifikator eller en outputdekorator. Kun værdien (tidspunktet) gemmes. Mange detaljer i dette relaterede svar:
- Ignorerer tidszoner helt i Rails og PostgreSQL
Derfor, hvis du vil bevare den del af inputstrengen, skal du udtrække den fra strengen og gemme den selv. Jeg ville bruge en tabel som:
CREATE TABLE tstz
...
, ts timestamp -- without time zone
, tz text
)
tz
, der er text
, kan indeholde en numerisk offset samt en tidszone forkortelse , eller en tidszone navn .
Vanskeligheden er at udtrække tidszonedelen i henhold til alle de forskellige regler, som parseren følger og på en måde, der ikke let går i stykker. I stedet for at lave din egen procedure, få parseren til at gøre arbejdet . Overvej denne demo:
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.
Fungerer med eller uden en T
mellem dato og klokkeslæt. Nøglelogikken er her:
right(tstz, -1 * length(tstz::timestamp::text)) AS tz
Tag det, der er tilbage af en tidsstempelstreng, efter at have trimmet længden af det, som parseren identificerede som dato/tidskomponent. Dette afhænger af, at inputtet er, som du sagde:
validerede ISO8601-strenge