PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Devo armazenar o fuso horário separadamente do timestamp para Postgres e JDBC?


Quando você armazena um timestamp with time zone (timestamptz ) é convertido em UTC para armazenamento no banco de dados. Quando recuperado, ele é convertido para o fuso horário atual do cliente, não para o fuso horário em que estava originalmente. É um ponto no tempo, basicamente.

Há também timestamp without time zone (timestamp ). Isso não está sujeito a conversão, mas não levar um carimbo de data/hora com ele. Se você armazenar um timestamp com o fuso horário do cliente definido como UTC, recupere-o quando o fuso horário do cliente for '+08:00', você obtém o mesmo valor. Isso é metade do que você deseja, pois preserva o valor bruto do tempo.

Os nomes e comportamentos são horríveis e confusos, mas definidos pelo padrão SQL.

Você deve armazenar o fuso horário separadamente se desejar gravar um ponto no tempo em um fuso horário específico. Eu recomendo armazená-lo como um INTERVAL com um CHECK restrição limitando-o a ser colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR . Essa definição rejeita -12:00 e aceita +12:00; Eu não estou totalmente certo de que está certo, então verifique.

Você pode armazenar o timestamp da hora local nesse fuso horário (o que eu provavelmente faria) ou armazenar o timestamptz da hora UTC em que o evento ocorreu mais um deslocamento que permite convertê-lo para a hora local.

Qualquer um funcionará bem para JDBC. Para JPA, dependerá de quão bem seu provedor entende e mapeia os tipos de intervalo. Idealmente, você deseja um campo gerado transitório em sua entidade que reconstrói a instância do Calendar desejada usando o timestamp e interval armazenados no banco de dados.