Du ber om bästa praxis. Jag tror att följande är den bästa praxis:
"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
Lägg först märke till användningen av DATE
nyckelord. Din fråga handlar om datum och ändå använder du ett datumformat som Oracle inte direkt stöder. Lyckligtvis stödjer Oracle ANSI-standarden DATE
nyckelord med ISO-standardformatet.
För det andra lade jag till en +1
så att du kan se slutet av tidsperioden, vilket förmodligen är vad du vill se i koden. Det bör inte påverka prestanda eftersom + 1
är på en konstant.
För det tredje har en datumkonstant en tidskomponent. När ingen anges är det midnatt på datumet. Så uttrycket:
"Date" BETWEEN '2014-04-11' AND '2014-04-12'
Är verkligen:
"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
Det vill säga att exakt en tid från det senare datumet ingår, första ögonblicket vid midnatt. Detta är vanligtvis inte vad du vill. Oracle gör det här problemet värre på två sätt:
date
datatypen innehåller en tidskomponent.- Standardsättet att presentera
date
värden har ingen tidskomponent.
Så, för att vara säkrast, använd följande regler:
- Använd inte
between
på datum. - Använd
>=
för första dejten. - Användare
<
för den andra.
Aaron Bertrand har en blogg
om just detta ämne. Även om det specifikt handlar om SQL Server, är många av idéerna tillämpliga på Oracle -- särskilt eftersom date
datatyp i Oracle inkluderar tider.