【问题标题】:How can I create an index based on the year and month of a timestamp?如何根据时间戳的年份和月份创建索引?
【发布时间】:2018-05-03 15:14:15
【问题描述】:

我正在尝试根据时间戳字段的年月创建索引(例如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 范围内工作吗?

【问题讨论】:

  • ts_field的数据类型是什么?..

标签: sql postgresql indexing


【解决方案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

【讨论】:

  • 该字段的类型为 timestamptz - 我尝试了您的代码,但不幸的是它仍然显示相同的错误:/
  • 对不起 - 漫长的一天。当然你需要将 tstz 调整为固定值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2014-09-07
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多