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

Indeks pada Stempel Waktu:Fungsi dalam ekspresi indeks harus ditandai sebagai TIDAK DAPAT DIUBAH

Pertama saya pikir ini mungkin bug di CREATE INDEX logika. Tapi intinya castnya dari text ke timestamptz itu sendiri bukan IMMUTABLE antara. Itu tergantung pada pengaturan yang mudah menguap seperti datestyle .

Dalam kasus khusus Anda, ada solusi yang bahkan lebih baik daripada yang Anda coba. Pindahkan pemeran ke dalam fungsi:

CREATE OR REPLACE FUNCTION to_text(text) 
  RETURNS text AS
$func$
SELECT to_char($1::timestamptz AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US') 
$func$ LANGUAGE sql IMMUTABLE;

Sama efisiennya, tetapi sekarang CREATE INDEX tidak akan muntah:

CREATE INDEX bar ON foo(to_text(j->>'start_time'));

Jelas, Anda harus menyesuaikan panggilan fungsi Anda dengan tepat:jatuhkan ::timestamptz dari ekspresi. Pastikan Anda menggunakan setelan yang sama di mana saja , atau indeks dapat menyebabkan hasil yang salah.

Lebih baik lagi

Gunakan ekspresi yang benar-benar tidak dapat diubah dengan to_timestamp() alih-alih pemeran (jika pola input Anda mengizinkannya):

CREATE OR REPLACE FUNCTION to_text(text) 
  RETURNS text AS
$func$
SELECT to_char(to_timestamp($1, 'YYYY-MM-DD"T"HH24:MI:SS.US')  -- adapt to your pattern
            AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US') 
$func$ LANGUAGE sql IMMUTABLE;

Namun perhatikan (mengutip pesan kesalahan dari pengujian saya):

Pola format "TZ"/"tz"/"OF" tidak didukung hingga_date




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Untuk mengabaikan kunci duplikat selama 'salin dari' di postgresql

  2. Memahami ukuran baris Postgres

  3. Cara Meningkatkan PostgreSQL 11 ke PostgreSQL 12 dengan Zero Downtime

  4. Cara Mengonfigurasi PostgreSQL Sharding dengan ClusterControl

  5. Menerapkan Pengaturan Multi-Pusat Data untuk PostgreSQL - Bagian Satu