Я хочу создать индекс для столбца, который хранит метку времени внутри значения JSON в Postgres. Индекс также необходимо преобразовать в часовой пояс. Это запрос, который мне нужно выполнить,
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}'));
error:" Нет функции, соответствующей заданному имени и типу аргумента. Возможно, вам потребуется добавить явное приведение типов ."
3)
CREATE INDEX CONCURRENTLY hotelUuid_checkIn_index3 ON reservations
(((json ->> '{details,attributes,checkIn}')::timestamptz) AT TIME ZONE 'America/SanTiego');
ошибка:" Нет функции, соответствующей заданному имени и типу аргумента. Возможно, вам придется добавить явные приведения типов"
Я знаю, что это неправильный способ создания индекса, поскольку это будет непроизводительным расходом, но в данный момент я не хочу изменять свои логики вставки данных c. Вот почему мне нужно создать индекс.
Я использую Postgresql 9.4.8 версию.