我想在 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 版本。