sql >> Databasteknik >  >> RDS >> PostgreSQL

Bevara tidszon i PostgreSQL timestamptz-typ

Som du redan har räknat ut själv, tidszonen sparas inte alls med Postgres datum/tidstyper, inte ens med timestamptz . Dess roll är bara en ingångsmodifierare respektive en utgångsdekoratör. Endast värdet (tidpunkten) sparas. Omfattande detaljer i detta relaterade svar:

  • Ignorerar tidszoner helt och hållet i Rails och PostgreSQL

Därför, om du vill bevara den delen av inmatningssträngen, måste du extrahera den från strängen och spara den själv. Jag skulle använda en tabell som:

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

tz , som är text , kan innehålla en numerisk offset samt en tidszon förkortning , eller en tidszon namn .

Svårigheten är att extrahera tidszonsdelen enligt alla olika regler som tolken följer och på ett sätt som inte går sönder lätt. Istället för att koka ihop din egen procedur låt parsern göra jobbet . Tänk på den här demon:

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

Fungerar med eller utan T mellan datum och tid. Nyckellogiken är här:

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

Ta det som är kvar av en tidsstämpelsträng efter att ha trimmat längden på det som parsern identifierade som datum-/tidskomponent. Detta är beroende av att inmatningen är, som du sa:

validerade ISO8601-strängar



  1. För en nybörjare, är det stor skillnad mellan MySQL och PostgreSQL

  2. Det går inte att förhindra SQLiteConnection-objektläckage

  3. Hur importerar jag XML-fil i Oracle SQL Developer?

  4. Spotlight Tuning Pack Basic:Det bästa gratis verktyget för SQL-optimering