Tu solución está bien. Sin embargo, si las fechas son literales, preferiría:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
Esto funciona exactamente igual, pero es más fácil de mantener, porque deja en claro el punto de que cada "fecha" literal es una marca de tiempo, no una fecha. Por ejemplo, suponga que en algún momento alguien cambia su consulta a la siguiente
AND datefield <= '2012-01-01'
... esperando (y fallando) incluir el día completo "2012-01-01" en la consulta. Con la sintaxis posterior, la intención es más clara y se evita esta confusión.
Para que quede aún más claro (quizás demasiado detallado), puede hacer el lanzamiento explícito:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
No usaría to_date()
aquí por razones similares (posible confusión de tipos de datos), ni to_timestamp()
(devuelve un timestamptz
).
Por cierto, he modificado el caso para cumplir con la práctica recomendada (palabras clave en mayúsculas, identificadores en minúsculas)