sql >> Database >  >> RDS >> PostgreSQL

Tijdzone behouden in PostgreSQL-tijdstempeltype

Zoals je zelf al hebt ontdekt, is de tijdzone wordt helemaal niet opgeslagen met Postgres datum / tijd typen, zelfs niet met timestamptz . Zijn rol is respectievelijk slechts een invoermodificator of een uitvoerdecorateur. Alleen de waarde (het tijdstip) wordt opgeslagen. Voldoende details in dit gerelateerde antwoord:

  • Tijdzones volledig negeren in Rails en PostgreSQL

Daarom, als je dat deel van de invoerreeks wilt behouden, moet je het uit de tekenreeks halen en zelf opslaan. Ik zou een tabel gebruiken als:

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

tz , zijnde text , kan een numerieke offset bevatten evenals een tijdzone afkorting , of een tijdzone naam .

De moeilijkheid is om het tijdzonegedeelte te extraheren volgens alle verschillende regels die de parser volgt en op een manier die niet gemakkelijk zal breken. In plaats van je eigen procedure te bedenken, laat je de parser het werk doen . Overweeg deze 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.

Werkt met of zonder een T tussen datum en tijd. De belangrijkste logica is hier:

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

Neem wat er over is van een tijdstempeltekenreeks na het inkorten van de lengte van wat de parser identificeerde als datum-/tijdcomponent. Dit is afhankelijk van de invoer, zoals u zei:

gevalideerde ISO8601-strings



  1. Hoe MySQL te installeren met phpMyAdmin op Ubuntu 12.04

  2. Alleen toetsenbordnavigatie gebruiken in Word, Excel en PowerPoint (deel 2:dialoogvensters)

  3. Verlaag de licentiekosten voor SQL Server

  4. Hoe haal je de datum van de mms uit content://mms.