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

O timestamp mais antigo suportado no PostgreSQL


O manual indica os valores Como:
  • Valor baixo:4713 aC
  • Valor alto:294276 AD

com a ressalva, como Chris observou, que -infinity também é suportado.

Veja a observação posteriormente na mesma página do manual; o acima só é verdadeiro se você estiver usando timestamps inteiros , que são o padrão em todas as versões vagamente recentes do PostgreSQL. Se em dúvida:
SHOW integer_datetimes;

vai te dizer. Se você estiver usando datetimes de ponto flutuante, obterá maior intervalo e menor precisão (não linear). Qualquer tentativa de definir o mínimo programaticamente deve lidar com essa restrição.

O PostgreSQL não permite apenas converter zero em um timestamp para obter o menor timestamp possível, nem isso faria muito sentido se você estivesse usando datetimes de ponto flutuante. Você pode use a função de conversão de data juliana, mas isso lhe dá a época não o tempo mínimo :
postgres=> select to_timestamp(0);
      to_timestamp      
------------------------
 1970-01-01 08:00:00+08
(1 row)

porque aceita valores negativos. Você pensaria que dar o máximo negativo funcionaria, mas os resultados são surpreendentes a ponto de me perguntar se temos um bug envolvente à espreita aqui:
postgres=> select to_timestamp(-922337203685477);
          to_timestamp           
---------------------------------
 294247-01-10 12:00:54.775808+08
(1 row)

postgres=> select to_timestamp(-92233720368547);
          to_timestamp           
---------------------------------
 294247-01-10 12:00:54.775808+08
(1 row)

postgres=> select to_timestamp(-9223372036854);
         to_timestamp         
------------------------------
 294247-01-10 12:00:55.552+08
(1 row)

postgres=> select to_timestamp(-922337203685);
ERROR:  timestamp out of range
postgres=> select to_timestamp(-92233720368);
          to_timestamp           
---------------------------------
 0954-03-26 09:50:36+07:43:24 BC
(1 row)

postgres=> select to_timestamp(-9223372036);
         to_timestamp         
------------------------------
 1677-09-21 07:56:08+07:43:24
(1 row)

(Talvez relacionado ao fato de que to_timestamp leva um double, mesmo que os timestamps sejam armazenados como inteiros hoje em dia?).

Eu acho que é possivelmente mais sensato deixar o intervalo de carimbo de data/hora ser qualquer carimbo de data/hora em que você não receba um erro. Afinal, o intervalo de timestamps válidos não é contínuo:
postgres=> SELECT TIMESTAMP '2000-02-29';
      timestamp      
---------------------
 2000-02-29 00:00:00
(1 row)

postgres=> SELECT TIMESTAMP '2001-02-29';
ERROR:  date/time field value out of range: "2001-02-29"
LINE 1: SELECT TIMESTAMP '2001-02-29';

então você não pode assumir que apenas porque um valor está entre dois timestamps válidos, ele é auto-válido.