代码之家  ›  专栏  ›  技术社区  ›  LittleBobbyTables

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

  •  1
  • LittleBobbyTables  · 技术社区  · 8 年前

    我正在尝试根据时间戳字段的年-月创建索引(例如。 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 演员,这很好,但我需要年度月份。

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

    1 回复  |  直到 8 年前
        1
  •  2
  •   Vao Tsun    8 年前

    这应该可以:

    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