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.