Först och främst bör du använda timestamptz istället för timestamp när du arbetar med flera tidszoner. Skulle undvika problemet helt.
Detaljer:
Du kan använd AT TIME ZONE konstruera som @NuLo föreslår
, det kan fungerar till och med, men inte riktigt som beskrivs.
AT TIME ZONE konverterar typen timestamp (timestamp without time zone ) till timestamptz (timestamp with time zone ) och vice versa. textrepresentationen av en timestamptz värdet beror på den aktuella inställningen för tidszonen i sessionen där du kör kommandot. Dessa två timestamptz värden är 100 % identiska (betecknar samma tidpunkt):
'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz
Men textrepresentationen är inte . Displayen är för olika tidszoner. Om du tar den här strängen bokstavligt och matar den till en timestamp typ, är tidszonsdelen bara ignorerad och du slutar med annorlunda värden. Därför, om du kör din COPY uttalande i en session med samma tidszonsinställning som din ursprungliga timestamp värden är för, händer den föreslagna operationen att arbeta.
Det rena sättet är dock att producera korrekt timestamp värden till att börja med genom att använda AT TIME ZONE två gånger :
SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM logtable
ORDER BY event desc;
'my_target_tz' är "din egen tidszon" och 'my_source_tz' tidszonen för molnservern i exemplet. Använd tidszonnamn för att säkerställa att sommartid respekteras , inte tidszonförkortningar. Dokumentationen:
Relaterat:
- Redovisning för sommartid i Postgres, när du väljer schemalagda objekt
- Tidszonsnamn med identiska egenskaper ger olika resultat när de tillämpas på tidsstämpel
Eller, mycket bättre än, använd timestamptz överallt och det fungerar automatiskt korrekt.