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

Różnica między znacznikami czasu z/bez strefy czasowej w PostgreSQL

Różnice zostały omówione w dokumentacji PostgreSQL dla typów daty/godziny. Tak, traktowanie TIME lub TIMESTAMP różni się między jednym WITH TIME ZONE lub WITHOUT TIME ZONE . Nie wpływa na sposób przechowywania wartości; wpływa to na sposób ich interpretacji.

Wpływ stref czasowych na te typy danych jest szczegółowo omówiony w dokumentach. Różnica wynika z tego, co system może racjonalnie wiedzieć o wartości:

  • Ze strefą czasową jako częścią wartości, wartość może być renderowana jako czas lokalny w kliencie.

  • Bez strefy czasowej jako części wartości, oczywista domyślna strefa czasowa to UTC, więc jest renderowana dla tej strefy czasowej.

Zachowanie różni się w zależności od co najmniej trzech czynników:

  • Ustawienie strefy czasowej w kliencie.
  • Typ danych (np. WITH TIME ZONE lub WITHOUT TIME ZONE ) wartości.
  • Czy wartość jest określona w określonej strefie czasowej.

Oto przykłady obejmujące kombinacje tych czynników:

foo=> SET TIMEZONE TO 'Japan';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 00:00:00+09
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 06:00:00+09
(1 row)

foo=> SET TIMEZONE TO 'Australia/Melbourne';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 00:00:00+11
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 08:00:00+11
(1 row)


  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 rzutować tablicę json na tablicę tekstową?

  2. Odwołaj się do aliasu nazwy kolumny w klauzuli WHERE

  3. Planeta PostgreSQL w galaktyce Ansible

  4. Chcę pobrać dane z innej nazwy tabeli za pomocą funkcji postgresql

  5. PostgreSQL GROUP_CONCAT() Odpowiednik