PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Najwcześniejszy znacznik czasu obsługiwany w PostgreSQL

W instrukcji podano wartości jako:

  • Niska wartość:4713 pne
  • Wysoka wartość:294276 AD

z zastrzeżeniem, jak zauważył Chris, że -infinity jest również obsługiwany.

Zobacz notatkę później na tej samej stronie w instrukcji; powyższe jest prawdziwe tylko wtedy, gdy używasz całkowitych znaczników czasu , które są domyślne we wszystkich niejasno najnowszych wersjach PostgreSQL. W razie wątpliwości:

SHOW integer_datetimes;

powiem Ci. Jeśli zamiast tego używasz dat zmiennoprzecinkowych, uzyskasz większy zakres i mniejszą (nieliniową) precyzję. Każda próba programowego wypracowania minimum musi poradzić sobie z tym ograniczeniem.

PostgreSQL nie tylko pozwala rzutować zero na znacznik czasu, aby uzyskać minimalny możliwy znacznik czasu, ani nie miałoby to większego sensu, gdybyś używał zmiennoprzecinkowych dat i godzin. możesz użyj funkcji przeliczania daty julian, ale to daje epokę nie minimalny czas :

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

ponieważ przyjmuje wartości ujemne. Można by pomyśleć, że podanie negatywnego maksinta zadziała, ale wyniki są zaskakujące do tego stopnia, że ​​zastanawiam się, czy nie czai się tu zawijający błąd:

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)

(Być może jest to związane z faktem, że to_timestamp przyjmuje podwójną wartość, mimo że znaczniki czasu są obecnie przechowywane jako liczby całkowite?).

Myślę, że najrozsądniej jest po prostu pozwolić, aby zakres znaczników czasowych był dowolnym znacznikiem czasowym, w którym nie pojawi się błąd. W końcu zakres prawidłowych znaczników czasu nie jest ciągły:

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

więc nie można zakładać, że tylko dlatego, że wartość znajduje się między dwoma ważnymi znacznikami czasu, jest ona samoczynna.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nierozpoznany parametr konfiguracyjny autocommit w PostgreSQL NodeJS

  2. niezakończone pole cytowania CSV w Postgresie

  3. Błąd podczas ustawiania właściwości konfiguracji bazy danych dla IDatabaseConnection (HSQLDB)

  4. Ustawienie schematu w PostgreSQL JDBC nie działa

  5. Zapytanie o połączenie Rails