PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Il primo timestamp supportato in PostgreSQL

Il manuale indica i valori come:

  • Basso valore:4713 aC
  • Valore elevato:294276 d.C.

con l'avvertenza, come ha notato Chris, che -infinity è anche supportato.

Vedi la nota più avanti nella stessa pagina del manuale; quanto sopra è vero solo se stai usando timestamp interi , che sono l'impostazione predefinita in tutte le versioni vagamente recenti di PostgreSQL. In caso di dubbio:

SHOW integer_datetimes;

te lo dirò. Se invece utilizzi datetime in virgola mobile, ottieni un intervallo maggiore e una precisione inferiore (non lineare). Qualsiasi tentativo di elaborare il minimo in modo programmatico deve far fronte a tale restrizione.

PostgreSQL non ti consente solo di eseguire il cast di zero su un timestamp per ottenere il timestamp minimo possibile, né ciò avrebbe molto senso se utilizzassi datetime in virgola mobile. puoi usa la funzione di conversione della data di Julian, ma questo ti dà l'epoca non il tempo minimo :

postgres=> select to_timestamp(0);
      to_timestamp      
------------------------
 1970-01-01 08:00:00+08
(1 row)

perché accetta valori negativi. Penseresti che dargli un maxint negativo funzionerebbe, ma i risultati sono sorprendenti al punto che mi chiedo se abbiamo un bug avvolgente in agguato qui:

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)

(Forse correlato al fatto che to_timestamp richiede un doppio, anche se i timestamp sono archiviati come numeri interi in questi giorni?).

Penso che sia forse più saggio lasciare che l'intervallo di timestamp sia qualsiasi timestamp su cui non si ottiene un errore. Dopotutto, l'intervallo di timestamp validi non è continuo:

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';

quindi non puoi presumere che solo perché un valore è compreso tra due timestamp validi, sia valido di per sé.