Първо, трябва да използвате timestamptz
вместо timestamp
когато работите с множество часови зони. Ще избегне напълно проблема.
Подробности:
Вие можете използвайте AT TIME ZONE
конструкция като @NuLo предлага
, може дори работи, но не точно както е описано.
AT TIME ZONE
преобразува типа timestamp
(timestamp without time zone
) към timestamptz
(timestamp with time zone
) и обратно. Представяне на текст на timestamptz
стойността зависи от текущата настройка на часовата зона в сесията, в която изпълнявате командата. Тези два timestamptz
стойности са 100 % идентични (означават една и съща точка във времето):
'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz
Но представянето на текст не е . Дисплеят е за различни часови зони. Ако вземете този низов литерал и го подадете към timestamp
тип, частта за часовата зона просто се игнорира и в крайна сметка получавате различни стойности. Следователно, ако изпълните своя COPY
израз в сесия със същата настройка за часова зона като първоначалния ви timestamp
стойностите са за, предложената операция се случва на работа.
Чистият начин обаче е да се създаде правилен timestamp
стойности, като започнете с прилагането на AT TIME ZONE
два пъти :
SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM logtable
ORDER BY event desc;
'my_target_tz'
е „вашата собствена часова зона“ и 'my_source_tz'
часовата зона на облачния сървър в примера. За да сте сигурни, че DST се спазва, използвайте имена на часови зони , а не съкращения на часови зони. Документацията:
Свързани:
- Отчитане на лятното часово време в Postgres при избиране на планирани елементи
- Имена на часови зони с идентични свойства дават различен резултат, когато се прилагат към клеймо за време
Или, още по-добре, използвайте timestamptz
навсякъде и работи правилно автоматично.