Według tego wątku na liście dyskusyjnej hakerów:
http://www.mail-archive.com/[email protected]/msg86725.html
jest to zamierzone zachowanie jak to_char
zależy od ustawienia LC_MESSAGES
W twoim przypadku najwyraźniej nie ma to sensu, ponieważ używany format nigdy nie będzie zależał od ustawień regionalnych, więc jeśli potrzebujesz użyć reprezentacji tekstowej w indeksie, możesz utworzyć własną funkcję to_char() i oznaczyć ją jako niezmienne:
CREATE OR REPLACE FUNCTION my_to_char(some_time timestamp)
RETURNS text
AS
$BODY$
select to_char($1, 'yyyy-mm-dd');
$BODY$
LANGUAGE sql
IMMUTABLE;
Jeśli musisz użyć go jako tekstu w indeksie (i nie możesz użyć rzutowania na datę, jak sugerował Sam), będziesz musiał utworzyć własną funkcję formatowania, którą możesz oznaczyć jako niezmienną. To może być następnie użyte w indeksie.
Ale żeby Postgres używał indeks, który będziesz musiał wywołać my_to_char()
również w instrukcjach SQL. Nie rozpozna go, gdy użyjesz wbudowanej funkcji to_char()
Myślę jednak, że sugestia Sama, aby użyć prostej daty w indeksie, jest prawdopodobnie lepsza