PostgreSQL:索引时间戳的日期部分

Ada*_*tan 10 postgresql indexing date

请考虑下表:

       Column       |           Type           |
--------------------+--------------------------+
 id                 | bigint                   |
 creation_time      | timestamp with time zone |
...
Run Code Online (Sandbox Code Playgroud)

像下面这样的查询(更不用说更复杂的JOIN)需要相当长的时间,因为它们需要为每个项计算creation_time :: DATE:

SELECT creation_time::DATE, COUNT(*) FROM items GROUP BY 1;
Run Code Online (Sandbox Code Playgroud)

如何在时间戳的那一天创建索引 - creation_time::DATE

我试过了:

  • CREATE INDEX items_day_of_creation_idx ON items (creation_time)::date;
  • CREATE INDEX items_day_of_creation_idx ON items (creation_time::date);

但都失败了:

ERROR:  syntax error at or near "::"
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 10

在表达式上创建索引时,必须在括号之间放置表达式(除了围绕列/表达式列表的括号外:

CREATE INDEX items_day_of_creation_idx ON items ( (creation_time::date) );
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。现在我得到“错误:索引表达式中的函数必须标记为 IMMUTABLE”。有趣的是,因为日期的日期部分是不可变的。 (3认同)
  • @AdamMatan:啊,我忽略了数据类型。`timestamp with time zone` 到 `date` 的转换不是“不可变的”(因为它取决于时区)。这仅在您使用“不带时区的时间戳”时才有效 (3认同)