sql >> Databáze >  >> RDS >> PostgreSQL

Nejstarší časové razítko podporované v PostgreSQL

V příručce jsou uvedeny hodnoty jako:

  • Nízká hodnota:4713 př.nl
  • Vysoká hodnota:294276 AD

s výhradou, jak poznamenal Chris, že -infinity je také podporováno.

Viz poznámka dále na stejné stránce v návodu; výše uvedené platí pouze v případě, že používáte celočíselná časová razítka , které jsou výchozí ve všech nejasně posledních verzích PostgreSQL. Máte-li pochybnosti:

SHOW integer_datetimes;

řekne ti. Pokud místo toho používáte datum a čas s pohyblivou řádovou čárkou, získáte větší rozsah a menší (nelineární) přesnost. Jakýkoli pokus programově vypracovat minimum se musí s tímto omezením vyrovnat.

PostgreSQL vám nedovolí pouze vrhnout nulu na časové razítko, abyste získali minimální možné časové razítko, ani by to nedávalo velký smysl, pokud byste používali datum a čas s pohyblivou řádovou čárkou. můžete použijte funkci převodu juliánského data, ale tím získáte epochu nikoli minimální čas :

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

protože přijímá záporné hodnoty. Člověk by si myslel, že dá záporný maxint by fungovalo, ale výsledky jsou překvapivé do té míry, že by mě zajímalo, jestli tady nečíháme zavinovací bug:

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)

(Možná to souvisí se skutečností, že to_timestamp trvá dvojnásobek, i když jsou časová razítka dnes uložena jako celá čísla?).

Myslím, že je možná nejmoudřejší ponechat rozsah časového razítka jakékoli časové razítko, na kterém se neobjeví chyba. Ostatně rozsah platných časových razítek není spojitý:

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

takže nemůžete předpokládat, že jen proto, že je hodnota mezi dvěma platnými časovými razítky, je její vlastní platnost.



  1. SQL Server Změna názvu databáze

  2. SQL Server 2008 – Pokročilé vyhledávání/Řazení

  3. Jak zadat název primárního klíče v EF-Code-First

  4. Jak změnit uživatele na superuživatele v PostgreSQL