sql >> Database >  >> RDS >> PostgreSQL

Verschil tussen tijdstempels met/zonder tijdzone in PostgreSQL

De verschillen worden behandeld in de PostgreSQL-documentatie voor datum/tijd-typen. Ja, de behandeling van TIME of TIMESTAMP verschilt tussen één WITH TIME ZONE of WITHOUT TIME ZONE . Het heeft geen invloed op hoe de waarden worden opgeslagen; het beïnvloedt hoe ze worden geïnterpreteerd.

De effecten van tijdzones op deze gegevenstypen worden specifiek behandeld in de documenten. Het verschil komt voort uit wat het systeem redelijkerwijs kan weten over de waarde:

  • Met een tijdzone als onderdeel van de waarde, kan de waarde worden weergegeven als een lokale tijd in de client.

  • Zonder een tijdzone als onderdeel van de waarde, is de voor de hand liggende standaardtijdzone UTC, dus wordt deze weergegeven voor die tijdzone.

Het gedrag verschilt afhankelijk van ten minste drie factoren:

  • De tijdzone-instelling in de client.
  • Het gegevenstype (d.w.z. WITH TIME ZONE of WITHOUT TIME ZONE ) van de waarde.
  • Of de waarde is opgegeven met een bepaalde tijdzone.

Hier zijn voorbeelden van combinaties van deze factoren:

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. Oracle SQL:een tabel bijwerken met gegevens uit een andere tabel

  2. Hoe de maximale verbindingen in postgre te verhogen?

  3. Oracle DB:hoe kan ik een query schrijven waarbij ik case negeer?

  4. VARCHAR- en NVARCHAR-gegevenstypen in SQL Server