Както вече разбрахте сами, часовата зона не се записва изобщо с типовете дата/час в Postgres, дори с timestamptz
. Ролята му е просто модификатор на входа или съответно декоратор на изхода. Запазва се само стойността (момента във времето). Достатъчни подробности в този свързан отговор:
- Изцяло игнориране на часовите зони в Rails и PostgreSQL
Следователно, ако искате да запазите тази част от входния низ, трябва да я извлечете от низа и да я запишете сами. Бих използвал таблица като:
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