Postgres使用to_timezone格式在JSONB日期时间字符串上创建索引

时间:2018-08-21 16:39:22

标签: postgresql jsonb timestamp-with-timezone

使用postgres 10.4。

我有一个表my_table1,其中列attr_a声明为jsonb

在该字段中,我有{ my_attrs: {UpdatedDttm:'<date as iso8601 str>}}

例如:

{ my_attrs: {UpdatedDttm:'2018-09-20T17:55:52Z'}}

我在查询中使用需要排序的日期(并与另一个日期进行比较)。

因为日期是字符串,所以我必须使用to_timestamp即时将它们转换为时间戳。

但是我还需要将该顺序和过滤条件添加到索引中。 这样Postgres可以利用它。

问题是,我的索引创建失败,并显示以下消息:

create index my_table1__attr_a_jb_UpdatedDttm__idx ON my_table1 using btree (((to_timestamp(attr_a->'my_attrs'->>'UpdatedDttm', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')) ) DESC);
  

错误:索引表达式中的函数必须标记为IMMUTABLE SQL   状态:42P17

是否有一种方法可以使它正常工作(希望没有创建自定义日期格式功能),并且我需要保留时区(不能删除它)。

我检查了similar question

我使用的是to_timestamp推荐的内容,并且没有:: timestamptz类型转换。

如果我使用内置函数,仍然会出现错误。

该答案建议创建自己的函数(但我试图避免这种情况(如底部问题中所述,因为它需要重写/更改所有使用该表的sql statemetns)。

1 个答案:

答案 0 :(得分:0)

您可以创建一个INSERT / UPDATE触发器,将嵌套的JSONB值移到顶层列;然后像正常一样索引。然后,您还可以在查询中使用该顶层列,从而有效地忽略嵌套的JSONB值。