sql >> Database teknologi >  >> RDS >> PostgreSQL

Bevar tidszone i PostgreSQL timestamptz type

Som du allerede selv har fundet ud af, er tidszonen gemmes slet ikke med Postgres dato/tidstyper, ikke engang med timestamptz . Dens rolle er kun henholdsvis en inputmodifikator eller en outputdekorator. Kun værdien (tidspunktet) gemmes. Mange detaljer i dette relaterede svar:

  • Ignorerer tidszoner helt i Rails og PostgreSQL

Derfor, hvis du vil bevare den del af inputstrengen, skal du udtrække den fra strengen og gemme den selv. Jeg ville bruge en tabel som:

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

tz , der er text , kan indeholde en numerisk offset samt en tidszone forkortelse , eller en tidszone navn .

Vanskeligheden er at udtrække tidszonedelen i henhold til alle de forskellige regler, som parseren følger og på en måde, der ikke let går i stykker. I stedet for at lave din egen procedure, få parseren til at gøre arbejdet . Overvej denne 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.

Fungerer med eller uden en T mellem dato og klokkeslæt. Nøglelogikken er her:

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

Tag det, der er tilbage af en tidsstempelstreng, efter at have trimmet længden af ​​det, som parseren identificerede som dato/tidskomponent. Dette afhænger af, at inputtet er, som du sagde:

validerede ISO8601-strenge



  1. Er det muligt at slette fra flere tabeller i samme SQL-sætning?

  2. Rul A tilbage, hvis B går galt. fjederstøvle, jdbctemplate

  3. Vil du oprette forbindelse til MS SQL Server med Windows-godkendelse ved hjælp af Python?

  4. Sådan fejlfinder du ORA-02049 og låser problemer generelt med Oracle