According to this thread in the hackers mailing list:
http://www.mail-archive.com/pgsql-hackers@postgresql.org/msg86725.html
this is intended behaviour as to_char
depends on the LC_MESSAGES setting
In your case this apparently doesn't make sense as the format you are using will never depend on the locale, so if you do need to use the text representation in the index, you can create your own to_char() function and mark it as immutable:
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;
If you have to use it as a text in the index (and cannot use the cast to a date as Sam suggested) you will need to create your own formatting function that you can mark as immutable. That can then be used in the index.
But to make Postgres use the index you will need to call my_to_char()
in your SQL statements as well. It will not recognize it when you use the built-in to_char()
But I do think Sam's suggestion using a straight date in the index is probably better
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…