【发布时间】:2016-01-23 18:19:37
【问题描述】:
我想在我的表上为 start_time 创建一个索引,这是一个名为 match 的 json 列中的 timestamptz(带时区的时间戳)字段。
关注this question 和this article 我知道由于时区和本地化不同,您无法在timestamptz 字段上创建索引。这两个都表明你可以在时间戳上创建索引(转换为文本),所以我尝试了以下功能:
CREATE OR REPLACE FUNCTION to_text(timestamptz)
RETURNS text AS $$
SELECT to_char($1 at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US')
$$
LANGUAGE sql
IMMUTABLE;
我认为这与时区和本地化没有问题。
CREATE INDEX i_match_start_time ON matches (to_text(((match->>'start_time')::timestamptz)));
这将返回以下内容:
ERROR: functions in index expression must be marked IMMUTABLE
我也尝试过返回时间戳的函数:
SELECT ($1 at time zone 'UTC')
以及返回 unix 时间的函数(尝试双精度并转换为十进制):
SELECT EXTRACT(EPOCH FROM $1)
每个都返回相同的错误。
我需要在 start_time 上建立索引,因为几乎所有对该表的选择查询都将按 start_time 排序。
感谢您的帮助。
【问题讨论】:
-
to_text()可能是不可变的,但to_text(((match->>'start_time')::timestamptz))不是 -
@a_horse_with_no_name 你能解释一下为什么吗?我该如何解决?
标签: sql postgresql