sql >> Databasteknik >  >> RDS >> PostgreSQL

Den tidigaste tidsstämpeln stöds i PostgreSQL

Handboken anger värdena som:

  • Lågt värde:4713 f.Kr.
  • Högt värde:294276 AD

med varningen, som Chris noterade, att -infinity stöds också.

Se anteckningen senare på samma sida i manualen; ovanstående är bara sant om du använder heltal tidsstämplar , som är standard i alla vagt nya versioner av PostgreSQL. Om du är osäker:

SHOW integer_datetimes;

ska berätta för dig. Om du istället använder flyttal datumtider får du större räckvidd och mindre (icke-linjär) precision. Varje försök att räkna ut minimumet programmässigt måste klara av den begränsningen.

PostgreSQL låter dig inte bara kasta noll till en tidsstämpel för att få minsta möjliga tidsstämpel, och det skulle inte heller vara mycket meningsfullt om du använde flyttal datumtider. Du kan använd den julianska datumkonverteringsfunktionen, men detta ger dig epoken inte minimitiden :

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

eftersom den accepterar negativa värden. Man skulle kunna tro att det skulle fungera att ge det negativ maxint, men resultaten är överraskande till den grad att jag undrar om vi har en omslutande bugg som lurar här:

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)

(Kanske relaterat till det faktum att to_timestamp tar en dubbel, även om tidsstämplar lagras som heltal nuförtiden?).

Jag tror att det möjligen är klokast att bara låta tidsstämpelintervallet vara vilken tidsstämpel som helst man inte får fel på. När allt kommer omkring är intervallet för giltiga tidsstämplar inte kontinuerligt:

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

så du kan inte anta att bara för att ett värde ligger mellan två giltiga tidsstämplar så är det självgiltigt.



  1. MySQL (Windows10) FULLTEXT-sökning med MyISAM-tabeller fungerar inte

  2. Databasstruktur för att hålla statistik per dag, vecka, månad, år

  3. Blir index snabbare än> jämförelse i MySQL?

  4. MySQL-valsfrågan är fruktansvärt långsam