【发布时间】:2022-01-21 02:36:20
【问题描述】:
对于英语我做:
select to_char(starts_at, 'TMHH:MIAM DayDD MonthYYYY') from events limit 1;
to_char
----------------------------------
5:40AM Saturday 18 December 2021
(1 row)
然后创建一个索引:
create index index_events_on_tsvector_english_starts_at
on events
using gin (to_tsvector('english', to_char(starts_at, 'TMHH:MIAM DayDD MonthYYYY'))
我知道我能做到:
SET LC_TIME = 'fr_FR';
但这不会为我的列编入法文索引以供将来添加的行吗? (不确定)
那么,我怎样才能创建一个英文索引和一个法文索引?这样我的法语和英语用户就可以通过全文搜索来搜索日期了吗?
编辑:我无法创建索引,因为我的函数不是不可变的
socializus_development=# create or replace function to_char_with_lc_time(
expression timestamp without time zone,
format text,
lc_time text
) returns text as $$
begin
set LC_TIME = lc_time;
select to_char(expression, format) as result;
set LC_TIME = "en_US.UTF-8";
return result;
end;
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE FUNCTION
socializus_development=# select to_char_with_lc_time(starts_at, 'FMHH24hMI TMDay DD TMMonth YYYY', 'fr_FR.UTF-8') from events limit 5;
ERROR: SET is not allowed in a non-volatile function
CONTEXT: SQL statement "SET LC_TIME = lc_time"
PL/pgSQL function to_char_with_lc_time(timestamp without time zone,text,text) line 3 at SET
【问题讨论】:
-
你给出的格式字符串无论如何都不依赖于 LC_TIME。
-
是的,我应该使用
TM,例如TMHH:MIAM DayDD MonthYYYY -
@jjanes 奇怪的是即使我这样做
SET LC_TIME = 'fr_FR.UTF-8';,select to_char(starts_at, 'TMHH:MIAM DayDD MonthYYYY') from events limit 1;给我一个英文结果 -
您需要在相关部分之前使用
TM,例如:SET LC_TIME = 'fr_FR.UTF-8'; select to_char(now(), 'TMHH:MIAM TMDayDD TMMonthYYYY');,给出:" 07:13PM Samedi18 Décembre2021" -
谢谢@Luuk
select to_char(starts_at, 'FMHH24hMI TMDay DD TMMonth YYYY') from events limit 1;给了我5h40 Samedi 18 Décembre 2021,我想我需要有法语/英语索引的功能
标签: sql postgresql strftime