sql >> Databasteknik >  >> RDS >> PostgreSQL

Omvandla tidsstämpel till lokal tid för en given tidszon under 'COPY .. TO ..'

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:

Eller, mycket bättre än, använd timestamptz överallt och det fungerar automatiskt korrekt.




  1. PHP Statement Bör returnera flera objekt men returnerar bara ett

  2. Hur får man de mest populära taggarna från normaliserade tabeller?

  3. Hur man beräknar skillnaden mellan två datum i månader i MySQL

  4. postgres känner inte igen temptabellen i funktion