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

Forskel mellem tidsstempler med/uden tidszone i PostgreSQL

Forskellene er dækket af PostgreSQL-dokumentationen for dato/tidstyper. Ja, behandlingen af ​​TIME eller TIMESTAMP adskiller sig mellem én WITH TIME ZONE eller WITHOUT TIME ZONE . Det påvirker ikke, hvordan værdierne opbevares; det påvirker, hvordan de fortolkes.

Effekterne af tidszoner på disse datatyper er specifikt dækket i dokumenterne. Forskellen skyldes, hvad systemet med rimelighed kan vide om værdien:

  • Med en tidszone som en del af værdien kan værdien gengives som en lokal tid i klienten.

  • Uden en tidszone som en del af værdien er den åbenlyse standardtidszone UTC, så den gengives for denne tidszone.

Adfærden varierer afhængigt af mindst tre faktorer:

  • Tidszoneindstillingen i klienten.
  • Datatypen (dvs. WITH TIME ZONE eller WITHOUT TIME ZONE ) af værdien.
  • Om værdien er angivet med en bestemt tidszone.

Her er eksempler, der dækker kombinationerne af disse faktorer:

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. En simpel introduktion til brug af MySQL på Linux-terminalen

  2. Hvad er CHAR_LENGTH() i MySQL?

  3. SQLite - Indsæt data

  4. Opdeling på et budget