为什么 to_char 不是 IMMUTABLE,我该如何解决?

Ada*_*tan 7 postgresql index string-representation

如何索引to_char()列的 a ?

我试过了:

adam_db=> CREATE INDEX updates_hourly_idx 
          ON updates (to_char(update_time, 'YYYY-MM-DD HH24:00'));
Run Code Online (Sandbox Code Playgroud)

但是得到了错误:

错误:必须标记索引表达式中的函数 IMMUTABLE

这看起来很奇怪,因为to_char()时间戳是相当不可变的。

任何想法如何生成该索引?

Dan*_*ité 7

接受的格式to_char(timestamp, text)包括使其不可变的本地化模式。

相同输入的不同结果示例:

测试=>开始;
测试 => 设置 lc_time='en_US.utf8';
测试 => 选择 to_char(now()::timestamp, 'TMDay');
 to_char 
---------
 周一

测试=> 将 lc_time 设置为 'fr_FR.utf8';
测试 => 选择 to_char(now()::timestamp, 'TMDay');
 to_char 
---------
 隆迪

测试=>结束;

如果不使用这种格式,解决方案是创建自己的不可变包装函数,

CREATE FUNCTION custom_to_char(timestamp) RETURNS text AS
$$ select to_char($1, 'YYYY-MM-DD HH24:00'); $$
LANGUAGE sql immutable;
Run Code Online (Sandbox Code Playgroud)

然后在该函数上创建索引。