PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zachowaj strefę czasową w typie PostgreSQL timestamptz

Jak już się zorientowałeś, strefa czasowa nie jest w ogóle zapisywany z typami daty / czasu Postgres, nawet z timestamptz . Jego rolą jest odpowiednio tylko modyfikator wejścia lub dekorator wyjścia. Zapisywana jest tylko wartość (punkt w czasie). Obszerne szczegóły w tej powiązanej odpowiedzi:

  • Całkowite ignorowanie stref czasowych w Rails i PostgreSQL

Dlatego, jeśli chcesz zachować tę część ciągu wejściowego, musisz wyodrębnić ją z ciągu i zapisać samodzielnie. Używałbym tabeli typu:

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

tz , będąc text , może zawierać liczbowe przesunięcie a także strefę czasową skrót lub strefa czasowa nazwa .

Trudność polega na wyodrębnieniu części strefy czasowej zgodnie ze wszystkimi różnymi regułami, których przestrzega parser i w sposób, który nie da się łatwo złamać. Zamiast wymyślać własną procedurę, spraw, by parser wykonał pracę . Rozważ tę prezentację:

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;

Skrzypce SQL.

Działa z lub bez T między datą a godziną. Kluczowa logika jest tutaj:

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

Weź to, co zostało z ciągu znacznika czasu po przycięciu długości tego, co parser zidentyfikował jako składnik daty/godziny. Opiera się to na wejściu, jak powiedziałeś:

zweryfikowane ciągi ISO8601



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić, która wersja Postgresa jest uruchomiona?

  2. INSERT IN TO ... FROM SELECT ... ZWRACANIE mapowań id

  3. Przyrostowa kopia zapasowa PostgreSQL i odzyskiwanie do określonego momentu

  4. Dodaj godziny do wartości czasu w PostgreSQL

  5. GROUP lub DISTINCT po JOIN zwraca duplikaty