sql >> Database >  >> RDS >> PostgreSQL

Vroegste tijdstempel ondersteund in PostgreSQL

De handleiding vermeldt de waarden als:

  • Lage waarde:4713 v.Chr.
  • Hoge waarde:294276 AD

met het voorbehoud, zoals Chris opmerkte, dat -infinity wordt ook ondersteund.

Zie de opmerking verderop op dezelfde pagina in de handleiding; het bovenstaande is alleen waar als u gebruikmaakt van gehele tijdstempels , die de standaard zijn in alle vaag recente versies van PostgreSQL. Bij twijfel:

SHOW integer_datetimes;

zal je vertellen. Als u in plaats daarvan drijvende-komma datumtijden gebruikt, krijgt u een groter bereik en minder (niet-lineaire) precisie. Elke poging om het minimum programmatisch uit te werken, moet aan die beperking voldoen.

PostgreSQL laat je niet alleen nul casten naar een tijdstempel om de minimaal mogelijke tijdstempel te krijgen, en dit zou ook niet veel zin hebben als je floating point datetimes zou gebruiken. Je kunt gebruik de juliaanse datumconversiefunctie, maar dit geeft je de epoch niet de minimale tijd :

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

omdat het negatieve waarden accepteert. Je zou denken dat een negatieve maxint zou werken, maar de resultaten zijn zo verrassend dat ik me afvraag of we hier een omhullende bug op de loer hebben:

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)

(Misschien heeft dit te maken met het feit dat to_timestamp een dubbele neemt, ook al worden tijdstempels tegenwoordig als gehele getallen opgeslagen?).

Ik denk dat het misschien het verstandigst is om het tijdstempelbereik gewoon een tijdstempel te laten zijn waarop je geen foutmelding krijgt. Het bereik van geldige tijdstempels is immers niet continu:

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

dus je kunt er niet vanuit gaan dat alleen omdat een waarde tussen twee geldige tijdstempels ligt, deze zelf geldig is.



  1. Maak verbinding met MySQL met JDBC via het netwerk

  2. Retourneer alleen de numerieke waarden uit een PostgreSQL-databasekolom

  3. Gegevens invoegen in MySQL vanuit een multidimensionale array in php

  4. back-up van mysql-database met mysqldump