La soluzione va bene. Se le date letterali, preferisco, però:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
Questo esegue esattamente la stessa cosa, ma è più maintenable, perché rende evidente il punto di ogni "data" letterale di essere un timestamp, non è una data . Ad esempio, supponiamo che a volte qualcuno cambia la query al seguente
AND datefield <= '2012-01-01'
... in attesa (e non) per includere l'intera giornata "2012-01-01" nella query. Con la sintassi successiva, l'intenzione è più chiara e questa confusione viene prevenuta.
Per rendere ancora più chiaro (forse troppo prolisso), si può fare il cast esplicito:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
Non vorrei usare to_date()
qui per ragioni analoghe (potenziale tipo di dati confusione), né to_timestamp()
(si restituisce un timestamptz
).
BTW, ho modificato il caso di osservare le pratica raccomandata (parole chiave in maiuscolo, identificatori in minuscolo)
cosa c'è di sbagliato in questo, comunque? Potresti usare 'tra 2010-01-01' e 2012-01-01', ma è quasi lo stesso, davvero. C'è un modo migliore di farlo con MSSQL (non l'ho mai usato)? – Andre
@Andre È meglio specificare esplicitamente il formato della data. –
Va bene, è solo in esecuzione a lungo. Mi sono assicurato che esistesse un indice sul campo, ma mi ci è voluto molto più tempo di quanto mi ero abituato. –