0

我想在 Postgres 的 JSON 值中存储时间戳的列上创建一个索引。索引也需要转换为时区。这是我需要运行的查询,

SELECT count(*) FROM reservations 
WHERE (((json #>> ‘{details, attributes, checkIn}‘)::timestamptz
        at time zone
        (json #>> ‘{details, attributes, destinationTimeZone}’)
      )) >= ‘2020-03-17’
  AND (((json #>> ‘{details, attributes, checkIn}‘)::timestamptz
        at time zone
        (json #>> ‘{details, attributes, destinationTimeZone}’)
      )) < ‘2020-04-01’;

我尝试将索引创建为:

1)

CREATE INDEX CONCURRENTLY hotelUuid_checkIn_index3 ON reservations 
  (TO_TIMESTAMP(json ->> '{details,attributes,checkIn}')::timestamptz);

错误:“索引表达式中的函数必须标记为 IMMUTABLE

2)

CREATE INDEX CONCURRENTLY hotelUuid_checkIn_index3 ON reservations 
    (TO_TIMESTAMP(json ->> '{details,attributes,checkIn}'));

错误:“没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

3)

CREATE INDEX CONCURRENTLY hotelUuid_checkIn_index3 ON reservations 
  (((json ->> '{details,attributes,checkIn}')::timestamptz) AT TIME ZONE 'America/SanTiego');

错误:“没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换

我知道这不是创建索引的正确方法,因为这将是一种开销,但此时我不想更改我的数据插入逻辑。这就是为什么我需要创建一个索引。

我正在使用 Postgresql 9.4.8 版本。

4

0 回答 0