如何根据时间戳的年份和月份创建索引?

时间:2018-05-03 15:14:16

标签: sql postgresql indexing

我尝试根据时间戳字段的年月创建索引(例如2018-03)。

最初我尝试过:

create index tmp_year_mo on my_table
((to_char(DATE(ts_field AT TIME zone 'utc'), 'YYYY-MM')))

但不幸的是你得到ERROR: functions in index expression must be marked IMMUTABLE,因为该函数显然具有可变输出。这对我来说并不合理,因为我认为通过将时区设置为UTC(?)来消除输出的可变性。

其他所有发布此帖子的人都有一个更简单的问题,比如使用::DATE演员转换,这很好,但我需要年月。

我想一个解决方案可能是在表中创建一个全新的列然后用这个值填充它,然后将其索引,但是有一个表达式可以在CREATE INDEX领域内工作吗?

1 个答案:

答案 0 :(得分:1)

这应该有效:

create index tmp_year_mo on my_table
((date_trunc('month',ts_field at time zone 'utc')))

https://www.postgresql.org/message-id/f6b42095-5fe2-4f6a-8c49-6bd49badb3ad%40mm

  

您可以将时间戳移至固定时区

https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC