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

标签 sql postgresql indexing

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

最初我尝试这样做:

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

但不幸的是,您得到错误:索引表达式中的函数必须标记为IMMUTABLE,因为该函数显然具有可变输出。这对我来说不太有意义,因为我认为我通过将时区设置为 UTC(?)来消除输出的可变性。

其他执行此操作并发布相关信息的人都遇到了一个更简单的问题,例如仅使用 ::DATE 转换进行转换,这很好,但我需要年月。

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

最佳答案

这应该有效:

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

you can shift your timestamptz to a fixed timezone

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

关于sql - 如何根据时间戳的年份和月份创建索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50158471/

相关文章:

R:使用索引向量中的值将列添加到数据框,包括 NA

php - 带有 SQL 函数的 Doctrine DQL 查询

mysql - 获取乐队内的记录数

sql - 如何在 postgresql 中更新表

c++ - C++ 中指针的索引

elasticsearch - 创建索引 Nest

php - 使用 PHP/Laravel 查询循环

MySQL - 将 LEFT JOIN 替换为 NOT IN

R 连接 Postgres

sql - Postgres 交叉表查询