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

PostgreSQL/JDBC e TIMESTAMP vs. TIMESTAMPTZ

Geralmente use TIMESTAMPTZ


Aqui está o conselho de David E. Wheeler, um especialista em Postgres, em uma postagem de blog cujo título diz tudo:
Sempre usar TIMESTAMP COM FUSO HORÁRIO (TIMESTAMPZ)

Se você estiver acompanhando momentos reais, pontos específicos na linha do tempo, use TIMESTAMP WITH TIME ZONE .

Uma exceção:particionamento


A única exceção de Wheeler é ao particionar em timestamps, devido a limitações técnicas. Uma exceção rara para a maioria de nos.

Para obter informações sobre particionamento, consulte doc e veja o Wiki .

Nome incorreto


Os nomes dos tipos de dados timestamp with time zone e timestamp without time zone são equívocos. Em ambos casos, o valor de data e hora é armazenado em UTC (sem deslocamento de fuso horário). Leia a frase anterior novamente. UTC, sempre. A frase "com fuso horário" significa "com atenção ao fuso horário", não "armazenar o fuso horário ao lado desse valor". A diferença entre os tipos é se qualquer fuso horário deve ser aplicado durante o armazenamento (INSERT ou UPDATE) ou na recuperação (consulta SELECT). (Este comportamento é descrito para Postgres -- Outros bancos de dados variam bastante a respeito disso.)

Mais precisamente, deve-se dizer que TIMESTAMP WITHOUT TIME ZONE armazena valores de data e hora sem fuso horário. Mas sem qualquer referência de período de tempo, qualquer pessoa que olhasse para esses dados teria que supor (esperar, rezar?) que os valores são UTC. Mas, novamente, discutível como você quase nunca deve usar esse tipo.

Leia o documento cuidadosamente, e experimente um pouco para esclarecer sua compreensão.

Sem zoneamento


Se você quiser armazenar a ideia geral de uma hora possível em vez de um momento específico, use o outro tipo, TIMESTAMP WITHOUT TIME ZONE .

Por exemplo, o Natal começa este ano no primeiro momento de 25 de dezembro de 2017. Isso seria 2017-12-25T 00:00:00 sem indicador de fuso horário nem deslocamento de UTC. Este valor é apenas uma vaga ideia sobre os momentos possíveis. Não tem significado até que apliquemos um fuso horário (ou deslocamento). Portanto, armazenamos isso usando TIMESTAMP WITHOUT TIME ZONE .

Os elfos que trabalham no Departamento de Logística de Eventos Especiais do Papai Noel aplicar os fusos horários como parte de seu processo de planejamento. Atualmente, o fuso horário mais antigo é Pacific/Kiribati , 14 horas antes do UTC. Os elfos agendam a primeira chegada do Papai Noel lá. Os elfos agendam um plano de voo levando as renas para outros fusos horários onde a meia-noite vem logo depois, como Pacific/Auckland . Eles continuam indo para o oeste à medida que a meia-noite de cada zona chega. Horas depois na Asia/Kolkata , ainda mais tarde em Europe/Paris , ainda mais horas depois em America/Montreal e assim por diante.

Cada um desses momentos específicos de entrega seria registrado pelos elfos usando WITH TIME ZONE , enquanto essa ideia geral de Natal seria armazenada como WITHOUT TIME ZONE .

Outro uso em aplicativos de negócios para WITHOUT TIME ZONE está agendando compromissos com mais de uma semana. Políticos de todo o mundo têm uma predileção inexplicável por mexer com o relógio e redefinir as regras de fuso horário. Eles ingressam no horário de verão (DST), saem do horário de verão, iniciam o horário de verão em uma data diferente ou terminam o horário de verão em uma data diferente ou alteram seus relógios em 15 minutos ou meia hora. Tudo isso foi feito nos últimos anos pela Turquia, Estados Unidos, Rússia, Venezuela e outros.

Os políticos muitas vezes fazem essas mudanças com pouco aviso prévio. Portanto, se você estiver agendando uma consulta odontológica por seis meses às 13:00, isso provavelmente deve ser armazenado como TIMESTAMP WITHOUT TIME ZONE ou de outra forma, os políticos podem efetivamente mudar seu horário para meio-dia, ou 14h, ou 13h30.