Nosso fuso horário do banco de dados é UTC. Às vezes, tenho usuários que se esquecem de alterar o fuso horário da sessão para UTC e, em seguida, obtêm um comportamento indesejado (por exemplo, ao usar now()
).
Existe uma maneira de
- Forçar todas as sessões para o fuso horário UTC?
- Pelo menos forçá-los uma vez ao conectar?
- Consulte todas as sessões, quais configurações de fuso horário elas usam?
pg_stat_activity
não parece conter essa informação.
Exemplo porque timestamp
não resolve todos os meus problemas:
create table a (c timestamp);
reset timezone;
show timezone; -- UTC
insert into a select now();
select * from a; -- 2024-03-13 12:50:14.515
set timezone to 'UTC+9';
show timezone; -- UTC+9
truncate a;
insert into a select now();
select * from a; -- 2024-03-13 03:50:48.376
reset timezone;
show timezone; -- UTC
select * from a; -- 2024-03-13 03:51:22.854
Não, você não pode fazer nenhuma dessas coisas. O fuso horário da sessão é uma variável global no processo backend do PostgreSQL e não pode ser acessada por outras sessões de banco de dados.
Você pode definir o
TimeZone
parâmetro empostgresql.conf
e esse se tornará o valor padrão para todas as sessões. Mas não há como impedir que um usuário interativo substituaTimeZone
oSET
comando ou aset_config()
função.Não vejo sentido em forçar
TimeZone
um determinado valor. Em vez disso, cada sessão de banco de dados deve definir o parâmetro conforme apropriado para o cliente. Se você deseja que seus carimbos de data e hora tenham a mesma aparência para todos os clientes (você deseja ser independente do fuso horário), usetimestamp without time zone
em vez detimestamp with time zone
e seu problema estará resolvido.O conselho a evitar
timestamp with time zone
na sua situação estende-se às funções.now()
retorna atimestamp with time zone
, então você deve usarlocaltimestamp
, que retorna o carimbo de data/hora da transação comotimestamp without time zone
.