Jak jste již sami zjistili, časové pásmo se vůbec neukládá s typy data/času Postgres, dokonce ani s timestamptz
. Jeho role je pouze modifikátor vstupu, respektive dekorátor výstupu. Uloží se pouze hodnota (časový bod). Dostatek podrobností v této související odpovědi:
- Úplné ignorování časových pásem v Rails a PostgreSQL
Pokud tedy chcete zachovat tuto část vstupního řetězce, musíte ji z řetězce extrahovat a uložit sami. Použil bych tabulku jako:
CREATE TABLE tstz
...
, ts timestamp -- without time zone
, tz text
)
tz
, což je text
, může obsahovat číselný offset a také zkratka časového pásma nebo název časového pásma .
Obtížnost spočívá v extrahování části časového pásma podle všech různých pravidel, kterými se analyzátor řídí, a způsobem, který nelze snadno prolomit. Místo vaření vlastního postupu nechte práci analyzátoru . Zvažte toto 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.
Funguje s nebo bez T
mezi datem a časem. Klíčová logika je zde:
right(tstz, -1 * length(tstz::timestamp::text)) AS tz
Vezměte to, co zbylo z řetězce časového razítka po oříznutí délky toho, co analyzátor identifikoval jako komponentu data/času. To závisí na vstupním bytí, jak jste uvedl:
ověřené řetězce ISO8601