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.