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

Transform tidsstemplet til lokal tid for en given tidszone under 'COPY .. TO ..'

Først og fremmest bør du bruge timestamptz i stedet for timestamp når du arbejder med flere tidszoner. Ville undgå problemet fuldstændigt.

Detaljer:

Du kan brug AT TIME ZONE konstruktion som @NuLo foreslår , det kan fungerer endda, men ikke helt som beskrevet.

AT TIME ZONE konverterer typen timestamp (timestamp without time zone ) til timestamptz (timestamp with time zone ) og omvendt. tekstrepræsentationen af en timestamptz værdien afhænger af den aktuelle indstilling af tidszonen i den session, hvor du kører kommandoen. Disse to timestamptz værdier er 100 % identiske (angiver det samme tidspunkt):

'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz

Men tekstgengivelsen er ikke . Displayet er for forskellige tidszoner. Hvis du tager denne streng bogstaveligt og giver den et timestamp type, er tidszonedelen bare ignoreret og du ender med anderledes værdier. Derfor, hvis du kører din COPY sætning i en session med samme tidszoneindstilling som dit oprindelige timestamp værdier er for, kommer den foreslåede handling at arbejde.

Den rene måde er imidlertid at producere korrekt timestamp værdier til at begynde med ved at anvende AT TIME ZONE to gange :

SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM   logtable
ORDER  BY event desc;

'my_target_tz' er "din egen tidszone" og 'my_source_tz' tidszonen for skyserveren i eksemplet. Brug tidszonenavne for at sikre, at sommertid overholdes , ikke tidszoneforkortelser. Dokumentationen:

Relateret:

Eller, meget bedre endnu, brug timestamptz overalt, og det fungerer automatisk korrekt.




  1. psycopg2 hvordan håndtere TypeError:ikke alle argumenter konverteres under strengformatering

  2. Databasedesign til apps ved hjælp af hashtags

  3. Kørsel af en SELECT-forespørgsel med en Ansible-opgave

  4. Postgres fejl med Sinatra/Haml/DataMapper på Heroku