Jak już się zorientowałeś, strefa czasowa nie jest w ogóle zapisywany z typami daty / czasu Postgres, nawet z timestamptz
. Jego rolą jest odpowiednio tylko modyfikator wejścia lub dekorator wyjścia. Zapisywana jest tylko wartość (punkt w czasie). Obszerne szczegóły w tej powiązanej odpowiedzi:
- Całkowite ignorowanie stref czasowych w Rails i PostgreSQL
Dlatego, jeśli chcesz zachować tę część ciągu wejściowego, musisz wyodrębnić ją z ciągu i zapisać samodzielnie. Używałbym tabeli typu:
CREATE TABLE tstz
...
, ts timestamp -- without time zone
, tz text
)
tz
, będąc text
, może zawierać liczbowe przesunięcie a także strefę czasową skrót lub strefa czasowa nazwa .
Trudność polega na wyodrębnieniu części strefy czasowej zgodnie ze wszystkimi różnymi regułami, których przestrzega parser i w sposób, który nie da się łatwo złamać. Zamiast wymyślać własną procedurę, spraw, by parser wykonał pracę . Rozważ tę prezentację:
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;
Skrzypce SQL.
Działa z lub bez T
między datą a godziną. Kluczowa logika jest tutaj:
right(tstz, -1 * length(tstz::timestamp::text)) AS tz
Weź to, co zostało z ciągu znacznika czasu po przycięciu długości tego, co parser zidentyfikował jako składnik daty/godziny. Opiera się to na wejściu, jak powiedziałeś:
zweryfikowane ciągi ISO8601