La tua soluzione va bene. Se le date sono letterali, preferirei però:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
Funziona esattamente allo stesso modo, ma è più manutenibile, perché chiarisce il punto in cui ogni "data" letterale è un timestamp, non una data. Ad esempio, supponi che a volte qualcuno modifichi la tua query come segue
AND datefield <= '2012-01-01'
... prevedendo (e non riuscendo) di includere l'intera giornata "2012-01-01" nella query. Con la sintassi successiva, l'intenzione è più chiara e questa confusione è prevenuta.
Per renderlo ancora più chiaro (forse troppo dettagliato), puoi eseguire il cast esplicito:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
Non userei to_date()
qui per ragioni simili (potenziale confusione tra i tipi di dati), né to_timestamp()
(restituisce un timestamptz
).
A proposito, ho modificato il caso per conformarsi alla pratica consigliata (parole chiave in maiuscolo, identificatori in minuscolo)