Estou trabalhando em um projeto de banco de dados PostgreSQL e estou querendo saber a melhor forma de armazenar carimbos de data/hora.
Suposições
Usuários em fusos horários diferentes usarão o banco de dados para todas as funções CRUD.
Analisei 2 opções:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
Pois timestamp
eu enviaria uma string que representaria o timestamp exato (UTC) para o momento INSERT.
Pois bigint
eu armazenaria exatamente a mesma coisa, mas em um formato numérico. (os problemas de fuso horário são tratados antes que o millis seja entregue ao servidor, portanto, sempre o millis em UTC.)
Uma vantagem principal de armazenar a bigint
poderia ser que seria mais fácil armazenar e recuperar, pois passar um timestamp corretamente formatado é mais complexo do que um simples número (millis desde o Unix Epoc).
Minha pergunta é qual deles permitiria o design mais flexível e quais poderiam ser as armadilhas de cada abordagem.
Armazene timestamps como
timestamp
, ou melhortimestamptz
(timestamp with time zone
) já que você está lidando com vários fusos horários . Isso impõe dados válidos e geralmente é mais eficiente. Certifique-se de entender o tipo de dados, existem alguns equívocos circulando:Para resolver sua preocupação:
Você pode passar e recuperar uma época do UNIX de qualquer maneira, se preferir:
Relacionado:
Se você deseja armazenar o carimbo de data/hora atual com gravações no banco de dados, use uma
timestamptz
coluna com valor padrãonow()
. A hora do sistema no servidor de banco de dados geralmente é muito mais confiável e consistente do que vários clientes entregando suas respectivas noções de que horas são.Pois
INSERT
pode ser tão simples quanto:E apenas não escreva para essa coluna. É preenchido automaticamente.
Você deve sempre armazenar dados em seu tipo de dados nativo para poder usar as funções internas. O tipo de dados de um carimbo de data/hora é:
timestamp
.Além disso, a não
timestamp
é armazenado como uma string, é armazenado como um inteiro de 8 bytes, exatamente o mesmo que : Documentação do PostgreSQL .bigint