Sua solução está bem. Se as datas forem literais, eu preferiria:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
Isso funciona exatamente da mesma forma, mas é mais fácil de manter, porque deixa claro o ponto de cada "data" literal ser um carimbo de data/hora, não uma data. Por exemplo, suponha que alguém altere sua consulta para o seguinte
AND datefield <= '2012-01-01'
... esperando (e não) incluir o dia inteiro "2012-01-01" na consulta. Com a sintaxe posterior, a intenção é mais clara e essa confusão é evitada.
Para deixar ainda mais claro (talvez muito detalhado), você pode fazer o cast explícito:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
Eu não usaria
to_date()
aqui por motivos semelhantes (potencial confusão de tipos de dados), nem to_timestamp()
(retorna um timestamptz
). BTW, modifiquei o caso para cumprir a prática recomendada (palavras-chave em maiúsculas, identificadores em minúsculas)