Código de amostra:
show timezone;
TimeZone
---------------
Europe/Berlin
(1 row)
create table foo (ts timestamp without time zone);
insert into foo values ('2023-10-28 23:58:00');
insert into foo values ('2023-10-29 00:58:00');
insert into foo values ('2023-10-29 01:58:00');
select (ts at time zone 'utc' at time zone 'Europe/Berlin')::timestamptz as x from foo order by x;
x
------------------------
2023-10-29 01:58:00+02
2023-10-29 02:58:00+01 <<<<------
2023-10-29 02:58:00+01
(3 rows)
Caso a linha marcada não seja
2023-10-29 02:58:00+02
?
Meu entendimento é que o relógio retrocede às 3h na Europa/Berlim, portanto UTC '2023-10-29 00:58:00'
deve corresponder a 02:58:00
antes do relógio voltar, portanto ainda +02, ou CEST, se preferir. Estou errado?
Isso
at time zone 'Europe/Berlin'
faz com que o deslocamento seja perdido. (Execute essa consulta e veja). Então, quando você retorna para timestamptz, não há informações sobre como escolher o deslocamento para adicionar novamente. Não há como ver desde o início para lembrar qual deslocamento ele tinha originalmente.