PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Stempel Waktu Terawal didukung di PostgreSQL

Manual menyatakan nilai sebagai:

  • Nilai rendah:4713 SM
  • Nilai tinggi:294276 M

dengan peringatan, seperti dicatat Chris, bahwa -infinity juga didukung.

Lihat catatan nanti di halaman yang sama di manual; di atas hanya berlaku jika Anda menggunakan stempel waktu bilangan bulat , yang merupakan default di semua versi PostgreSQL yang samar-samar baru-baru ini. Jika ragu:

SHOW integer_datetimes;

akan memberitahumu. Jika Anda menggunakan floating point datetimes, Anda mendapatkan rentang yang lebih besar dan presisi (non-linear) yang lebih sedikit. Upaya apa pun untuk menyelesaikan minimum secara terprogram harus mengatasi batasan itu.

PostgreSQL tidak hanya membiarkan Anda memberikan nol ke stempel waktu untuk mendapatkan stempel waktu seminimal mungkin, juga tidak masuk akal jika Anda menggunakan waktu titik mengambang. Anda bisa gunakan fungsi konversi tanggal julian, tetapi ini memberi Anda zaman bukan waktu minimum :

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

karena menerima nilai negatif. Anda akan berpikir bahwa memberikan maxint negatif akan berhasil, tetapi hasilnya mengejutkan sampai-sampai saya bertanya-tanya apakah kita memiliki bug penutup yang mengintai di sini:

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)

(Mungkin terkait dengan fakta bahwa to_timestamp mengambil dua kali lipat, meskipun stempel waktu disimpan sebagai bilangan bulat hari ini?).

Saya pikir mungkin paling bijaksana untuk membiarkan rentang stempel waktu menjadi stempel waktu yang Anda tidak mendapatkan kesalahan. Lagi pula, rentang stempel waktu yang valid tidak berkelanjutan:

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

jadi Anda tidak dapat berasumsi bahwa hanya karena suatu nilai berada di antara dua stempel waktu yang valid, nilai tersebut valid dengan sendirinya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan kamus untuk meneruskan parameter ke pernyataan postgresql dengan python

  2. django mendapatkan bulan dari tanggal untuk agregasi

  3. Tidak dapat terhubung ke https://api.elephantsql.com dari pg admin

  4. bidang kutipan CSV yang tidak diakhiri di Postgres

  5. tanda kutip tunggal muncul di sekitar nilai setelah menjalankan salinan di postgres 9.2