sql >> Databáze >  >> RDS >> PostgreSQL

Zachovat časové pásmo v typu Timestamptz PostgreSQL

Jak jste již sami zjistili, časové pásmo se vůbec neukládá s typy data/času Postgres, dokonce ani s timestamptz . Jeho role je pouze modifikátor vstupu, respektive dekorátor výstupu. Uloží se pouze hodnota (časový bod). Dostatek podrobností v této související odpovědi:

  • Úplné ignorování časových pásem v Rails a PostgreSQL

Pokud tedy chcete zachovat tuto část vstupního řetězce, musíte ji z řetězce extrahovat a uložit sami. Použil bych tabulku jako:

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

tz , což je text , může obsahovat číselný offset a také zkratka časového pásma nebo název časového pásma .

Obtížnost spočívá v extrahování části časového pásma podle všech různých pravidel, kterými se analyzátor řídí, a způsobem, který nelze snadno prolomit. Místo vaření vlastního postupu nechte práci analyzátoru . Zvažte toto 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.

Funguje s nebo bez T mezi datem a časem. Klíčová logika je zde:

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

Vezměte to, co zbylo z řetězce časového razítka po oříznutí délky toho, co analyzátor identifikoval jako komponentu data/času. To závisí na vstupním bytí, jak jste uvedl:

ověřené řetězce ISO8601



  1. Chyba při vytváření prostorové databáze. CHYBA:nelze načíst knihovnu /usr/pgsql-9.1/lib/rtpostgis-2.0.so

  2. Vytvořte nového uživatele v MySQL a dejte mu plný přístup k jedné databázi

  3. MySQL – Jak zrušit tabulku, pokud existuje v databázi?

  4. Jak vložit řetězec do jiného řetězce v MySQL pomocí INSERT()