PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zeitzone im PostgreSQL-Typ timestamptz beibehalten

Wie Sie bereits selbst herausgefunden haben, die Zeitzone wird bei Postgres-Datums-/Zeittypen überhaupt nicht gespeichert, auch nicht bei timestamptz . Seine Rolle ist nur ein Eingabemodifikator bzw. ein Ausgabedekorator. Es wird nur der Wert (der Zeitpunkt) gespeichert. Ausführliche Details in dieser verwandten Antwort:

  • Zeitzonen in Rails und PostgreSQL komplett ignorieren

Wenn Sie also diesen Teil der Eingabezeichenfolge beibehalten möchten, müssen Sie ihn aus der Zeichenfolge extrahieren und selbst speichern. Ich würde eine Tabelle wie folgt verwenden:

CREATE TABLE tstz
 ...
 , ts timestamp    -- without time zone
 , tz text
)

tz , wobei es sich um text handelt , kann einen numerischen Offset enthalten sowie eine Zeitzonen-Abkürzung , oder ein Name einer Zeitzone .

Die Schwierigkeit besteht darin, den Zeitzonenteil gemäß all den verschiedenen Regeln, denen der Parser folgt, und auf eine Weise zu extrahieren, die nicht leicht zu brechen ist. Anstatt Ihre eigene Prozedur zu erfinden, lassen Sie den Parser die Arbeit erledigen . Sehen Sie sich diese Demo an:

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-Geige.

Funktioniert mit oder ohne T zwischen Datum und Uhrzeit. Die Schlüssellogik ist hier:

right(tstz, -1 * length(tstz::timestamp::text)) AS tz

Nehmen Sie, was von einer Zeitstempelzeichenfolge übrig ist, nachdem Sie die Länge dessen, was der Parser als Datums- / Zeitkomponente identifiziert hat, gekürzt haben. Dies beruht auf der Eingabe, wie Sie gesagt haben:

validierte ISO8601-Strings