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:
- Regnskab for sommertid i Postgres, ved valg af planlagte varer
- Tidszonenavne med identiske egenskaber giver forskellige resultater, når de anvendes på tidsstemplet
Eller, meget bedre endnu, brug timestamptz
overalt, og det fungerer automatisk korrekt.