Estou trabalhando em um design de banco de dados PostgreSQL e estou me perguntando a melhor forma de armazenar registros de data e hora.
Suposições
Usuários em fusos horários diferentes usarão o banco de dados para todas as funções CRUD.
Eu olhei para duas opções:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
Pois timestamp
eu enviaria uma string que representaria o registro de data e hora 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 no UTC.)
Uma das principais vantagens do armazenamento de um bigint
seria que seria mais fácil armazenar e recuperar, pois a passagem de um carimbo de data / hora formatado corretamente é mais complexa do que um número simples (milésimos desde o Unix Epoc).
Minha pergunta é qual deles permitiria o design mais flexível e quais seriam as armadilhas de cada abordagem.
Respostas:
Armazene os carimbos de hora como
timestamp
, ou melhortimestamptz
(timestamp with time zone
), pois você está lidando com vários fusos horários . Isso aplica dados válidos e geralmente é mais eficiente. Certifique-se de entender o tipo de dados, existem alguns conceitos errados:Para resolver sua preocupação:
Você pode passar e recuperar uma época do UNIX de qualquer maneira, se preferir:
Palavras-chave:
Se você deseja armazenar o registro de data e 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 sua respectiva noção de que horas são.Pois
INSERT
pode ser tão simples quanto:E apenas não escreva nessa coluna. É preenchido automaticamente.
fonte
Você sempre deve armazenar dados em seu tipo de dados nativo para poder usar as funções internas. E o tipo de dado de um carimbo de data / hora é obviamente a
timestamp
.Btw, a não
timestamp
é armazenado como uma string, é armazenado como um número inteiro de 8 bytes, exatamente o mesmo que : documentação do PostgreSQL .bigint
fonte