Przede wszystkim powinieneś użyć timestamptz
zamiast timestamp
podczas pracy z wieloma strefami czasowymi. Pozwoliłoby to całkowicie uniknąć problemu.
Szczegóły:
możesz użyj AT TIME ZONE
konstrukcja taka jak @NuLo sugeruje
, może nawet działa, ale nie dokładnie tak, jak opisano.
AT TIME ZONE
konwertuje typ timestamp
(timestamp without time zone
) na timestamptz
(timestamp with time zone
) i wzajemnie. reprezentacja tekstowa timestamp
wartość zależy od bieżącego ustawienia strefy czasowej w sesji, w której uruchomiono polecenie. Te dwa timestamptz
wartości są w 100% identyczne (oznaczają ten sam punkt w czasie):
'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz
Ale reprezentacja tekstowa nie . Wyświetlacz dotyczy różnych stref czasowych. Jeśli weźmiesz ten literał ciągu i wprowadzisz go do timestamp
typ, część strefy czasowej jest po prostu ignorowana i otrzymujesz inne wartości. Dlatego jeśli uruchomisz COPY
oświadczenie w sesji z tym samym ustawieniem strefy czasowej, co oryginalny timestamp
wartości są dla, sugerowana operacja zdarza się do pracy.
Jednak czystym sposobem jest wygenerowanie poprawnego timestamp
wartości na początek, stosując AT TIME ZONE
dwa razy :
SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM logtable
ORDER BY event desc;
'my_target_tz'
to "Twoja własna strefa czasowa" i 'my_source_tz'
strefa czasowa serwera w chmurze w przykładzie. Aby upewnić się, że czas letni jest przestrzegany, użyj nazw stref czasowych , a nie skróty stref czasowych. Dokumentacja:
Powiązane:
- Uwzględnianie czasu letniego w Postgres podczas wybierania zaplanowanych elementów
- Nazwy stref czasowych o identycznych właściwościach dają różne wyniki po zastosowaniu do znacznika czasu
Lub, jeszcze lepiej, użyj timestamptz
wszędzie i działa poprawnie automatycznie.