No caso do MySQL ,
Os valores TIMESTAMP são armazenados como o número de segundos desde a época ('1970-01-01 00:00:00' UTC)`
No caso de PostgreSQL com versão menor ou igual a 9.6
os valores de timestamp são armazenados como segundos antes ou depois da meia-noite 2000-01-01
No caso de PostgreSQL com versão maior ou igual a 10 , não há explicação sobre isso
Tenho duas perguntas sobre a lógica interna do PostgreSQL.
- Ele ainda usa o mesmo padrão da versão 9.6?
- Por que "meia-noite 2000-01-01"? A época do Unix começa em
1970-01-01 00:00:00 UTC
. A época J2000 começa em12 noon (midday) on January 1, 2000
.
Parece que apenas alguns sistemas usam 2000-01-01 00:00:00
.
Como o PostgreSQL fornece funções para converter UNIX epoch em timestamp to_timestamp
ou vice-versa EXTRACT(EPOCH FROM ...)
, usar o padrão diferente do UNIX epoch parece exigir cálculos de deslocamento adicionais.
Essa informação da documentação 9.6 está errada. Os carimbos de data/hora são armazenados como microssegundos desde 2000-01-01 00:00:00.
Veja
include/datatype/timestamp.h
:Na versão 9.6, também havia a opção de armazenar registros de data e hora como valores de ponto flutuante, mas isso foi removido desde então.
Isso deve responder sua primeira pergunta.
A razão pela qual 2000 foi escolhido provavelmente decorre da época em que você podia armazenar registros de data e hora como valores de ponto flutuante. Aqui, a precisão melhorou para valores próximos da época, e fazia sentido escolher algo mais à prova de futuro do que 1970 (lembre-se, isso foi antes de 2000).
Subtrair uma constante para calcular a época do Unix não é um grande esforço.