PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chỉ mục trên Dấu thời gian:Các hàm trong biểu thức chỉ mục phải được đánh dấu là CÓ THỂ NGAY LẬP TỨC

Đầu tiên, tôi nghĩ đây có thể là lỗi trong CREATE INDEX Hợp lý. Nhưng vấn đề là diễn viên từ text đến timestamptz bản thân nó không phải là IMMUTABLE hoặc. Nó phụ thuộc vào các cài đặt dễ bay hơi như datestyle .

Trong trường hợp cụ thể của bạn, có một cách giải quyết thậm chí còn tốt hơn những gì bạn đã thử. Di chuyển dàn diễn viên vào hàm:

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;

Cũng hiệu quả, nhưng bây giờ CREATE INDEX sẽ không ngăn cản:

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

Rõ ràng, bạn phải điều chỉnh các lệnh gọi hàm của mình cho phù hợp:thả truyền ::timestamptz từ biểu thức. Đảm bảo rằng bạn sử dụng cùng một cài đặt ở mọi nơi hoặc chỉ mục có thể dẫn đến kết quả sai.

Tốt hơn nữa

Sử dụng một biểu thức thực sự bất biến với to_timestamp() thay vì ép kiểu (nếu mẫu nhập của bạn cho phép):

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;

Tuy nhiên, lưu ý (trích dẫn thông báo lỗi từ thử nghiệm của tôi):

Các mẫu định dạng "TZ" / "tz" / "OF" không được hỗ trợ trong to_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. PG ::Lỗi:SELECT DISTINCT, ORDER BY biểu thức phải xuất hiện trong danh sách lựa chọn

  2. Cách thay đổi người dùng thành Superuser trong PostgreSQL

  3. Tạo trình kích hoạt để chèn bảng con trả về lỗi khó hiểu

  4. Hướng dẫn sử dụng pgBouncer cho PostgreSQL

  5. PostgreSQL:Thời gian tạo bảng