PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Frühester Zeitstempel, der in PostgreSQL unterstützt wird

Das Handbuch gibt die Werte an als:

  • Niedriger Wert:4713 v. Chr.
  • Hoher Wert:294276 n. Chr.

mit der Einschränkung, wie Chris bemerkte, dass -infinity wird ebenfalls unterstützt.

Siehe Hinweis später auf derselben Seite im Handbuch; Das Obige gilt nur, wenn Sie ganzzahlige Zeitstempel verwenden , die der Standard in allen vage neueren Versionen von PostgreSQL sind. Im Zweifel:

SHOW integer_datetimes;

wird es dir sagen. Wenn Sie stattdessen Fließkomma-Datetimes verwenden, erhalten Sie einen größeren Bereich und eine geringere (nichtlineare) Genauigkeit. Jeder Versuch, das Minimum programmatisch herauszuarbeiten, muss mit dieser Einschränkung fertig werden.

Mit PostgreSQL können Sie nicht einfach Nullen in einen Zeitstempel umwandeln, um den kleinstmöglichen Zeitstempel zu erhalten, und dies wäre auch nicht sinnvoll, wenn Sie Datums- und Zeitangaben mit Gleitkommazahlen verwenden würden. Sie können Verwenden Sie die Julianische Datumskonvertierungsfunktion, aber dies gibt Ihnen die Epoche nicht die Mindestzeit :

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

weil es negative Werte akzeptiert. Man könnte meinen, dass es funktionieren würde, wenn man ihm ein negatives Maximum gibt, aber die Ergebnisse sind so überraschend, dass ich mich frage, ob hier ein umlaufender Fehler lauert:

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)

(Vielleicht im Zusammenhang mit der Tatsache, dass to_timestamp ein Double nimmt, obwohl Zeitstempel heutzutage als ganze Zahlen gespeichert werden?).

Ich denke, es ist möglicherweise am klügsten, den Zeitstempelbereich einfach einen beliebigen Zeitstempel zu lassen, bei dem Sie keinen Fehler erhalten. Schließlich ist der Bereich gültiger Zeitstempel nicht kontinuierlich:

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

Sie können also nicht davon ausgehen, dass ein Wert selbst gültig ist, nur weil er zwischen zwei gültigen Zeitstempeln liegt.