PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Най-ранното времево клеймо, поддържано в PostgreSQL

Ръководството посочва стойностите като:

  • Ниска стойност:4713 пр.н.е.
  • Висока стойност:294 276 г. сл. Хр.

с уговорката, както Крис отбеляза, че -infinity също се поддържа.

Вижте бележката по-късно на същата страница в ръководството; горното е вярно само ако използвате целочислени времеви марки , които са по подразбиране във всички неясно скорошни версии на PostgreSQL. Ако се съмнявате:

SHOW integer_datetimes;

ще ви кажа. Ако вместо това използвате дати и часове с плаваща запетая, получавате по-голям обхват и по-малка (нелинейна) точност. Всеки опит да се изработи минимумът програмно трябва да се справи с това ограничение.

PostgreSQL не ви позволява просто да прехвърляте нула към клеймо за време, за да получите минималния възможен клеймо за време, нито това би имало голям смисъл, ако използвате дати и часове с плаваща запетая. Вие можете използвайте функцията за преобразуване на юлианска дата, но това ви дава епохата не минималното време :

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

защото приема отрицателни стойности. Човек би си помислил, че даването на отрицателен maxint ще свърши работа, но резултатите са изненадващи до такава степен, че се чудя дали тук не се крие бъг:

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)

(Може би свързано с факта, че to_timestamp приема двойно, въпреки че времевите марки се съхраняват като цели числа в наши дни?).

Мисля, че вероятно е най-разумно просто да оставите диапазона на времевия печат да бъде всеки времеви печат, за който не получавате грешка. В края на краищата диапазонът от валидни времеви клейма не е непрекъснат:

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

така че не можете да приемете, че само защото дадена стойност е между два валидни времеви отпечатъка, тя е самовалидна.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво означава autocommit в postgresql и psycopg2?

  2. Намиране на данни от база данни, които най-добре отговарят на променливите отговори на потребителите

  3. Трябва да конвертирате сливането на Oracle в заявка към PostgreSQL

  4. PostgreSQL Получаване на произволна дата/час между две дата/час

  5. Rails ActiveRecord:Как да използвате свързващи променливи с двойни кавички на jsonb