Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL上从JSON创建时间戳索引_Postgresql_Jsonb - Fatal编程技术网

在PostgreSQL上从JSON创建时间戳索引

在PostgreSQL上从JSON创建时间戳索引,postgresql,jsonb,Postgresql,Jsonb,我在PostgreSQL上有一个表,其中有一个名为data的字段,即jsonb,其中有很多对象,我想建立一个索引来加速查询。我使用了几行来测试数据(只有15行),但我不想在将来的查询中出现问题。我从twitterapi获取数据,因此一周内我可以获得大约10gb的数据如果我使用正常索引 在tweet上创建索引((数据->>'created_at') 我得到一个文本索引,如果我: 在tweet上创建索引((CAST(data->>“created_at”作为时间戳)) 我明白了 错误:索引表达式中的

我在PostgreSQL上有一个表,其中有一个名为
data
的字段,即
jsonb
,其中有很多对象,我想建立一个索引来加速查询。我使用了几行来测试数据(只有15行),但我不想在将来的查询中出现问题。我从twitterapi获取数据,因此一周内我可以获得大约10gb的数据
如果我使用正常索引

在tweet上创建索引((数据->>'created_at')

我得到一个文本索引,如果我:

在tweet上创建索引((CAST(data->>“created_at”作为时间戳))

我明白了

错误:索引表达式中的函数必须标记为不可变

我试着让它“不可变”设置时区

date\u trunc('seconds',CAST(数据->>'created\u at'作为时间戳)在时区'GMT')


但我仍然得到了“不可变”的错误。那么,如何从JSON实现时间戳索引呢?我知道我可以用日期制作一个简单的列,因为它可能在时间中保持不变,但我想学习如何做到这一点。

索引中也不允许使用此表达式:

(CAST(data->>'created_at' AS timestamp) at time zone 'UTC')
它不是一成不变的,因为第一次强制转换取决于您的设置(以及其他因素)。函数调用后无法将结果转换为UTC,不确定性已经悄然出现

解决方案是一个函数,通过固定时区(如)使强制转换不可变

我建议使用(这也只是
稳定的
,而不是
不变的
),而不是使用cast来排除一些麻烦的来源-
日期样式

CREATE OR REPLACE FUNCTION f_cast_isots(text)
  RETURNS timestamptz AS
$$SELECT to_timestamp($1, 'YYYY-MM-DD HH24:MI')$$  -- adapt to your needs
  LANGUAGE sql IMMUTABLE;
请注意,这将返回
timestamptz
。然后:

CREATE INDEX foo ON t (f_cast_isots(data->>'created_at'));
此相关答案中对此技术的详细解释:

相关的:


唯一的解决方法是创建自己的函数进行转换(使用时区),将该函数声明为不可变,然后将该函数用于索引。