2015-12-15 17 views
5

Si consideri la seguente tabella:PostgreSQL: indice la parte giorno di un timestamp

 Column  |   Type   | 
--------------------+--------------------------+ 
id     | bigint     | 
creation_time  | timestamp with time zone | 
... 

query come le seguenti (per non parlare più complessi unisce) prende un po 'di tempo, perché deve calcolare CREATION_TIME :: DATA per ogni voce:

SELECT creation_time::DATE, COUNT(*) FROM items GROUP BY 1; 

Come faccio a creare un indice sulla parte giorno del timestamp - creation_time::DATE?

ho provato:

  • CREATE INDEX items_day_of_creation_idx ON items (creation_time)::date;
  • CREATE INDEX items_day_of_creation_idx ON items (creation_time::date);

Ma sia venuto a mancare con:

ERROR: syntax error at or near "::" 

risposta

4

Quando si crea un indice su un'espressione che espressione deve essere mettere tra parentesi (oltre alle parentesi che circondano la colonna/elenco di espressioni:

CREATE INDEX items_day_of_creation_idx ON items ((creation_time::date)); 
+1

Grazie. Ora ricevo 'ERRORE: le funzioni nell'espressione dell'indice devono essere contrassegnate come IMMUTABILI'. Divertente, perché la parte del giorno di una data è immutabile come diventa. –

+1

@AdamMatan: ah, ho trascurato il tipo di dati. La conversione di un 'timestamp con fuso orario' in un' date' non è "immutabile" (perché dipende dal fuso orario). Ciò funzionerebbe solo se si stesse utilizzando il 'timestamp senza fuso orario ' –

+0

Qualunque modo di effettuare la conversione nell'indice? –

Problemi correlati