Je vraagt om best practices. Ik denk dat het volgende de beste werkwijze is:
"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
Let eerst op het gebruik van de DATE
trefwoord. Je vraag gaat over datums en toch gebruikt u een datumnotatie die Oracle niet direct ondersteunt. Gelukkig ondersteunt Oracle de ANSI-standaard DATE
trefwoord met de ISO-standaardindeling.
Ten tweede heb ik een + 1
. toegevoegd zodat u het einde van de tijdsperiode kunt zien, wat vermoedelijk is wat u in de code wilt zien. Het zou de prestaties niet moeten beïnvloeden omdat de + 1
is constant.
Ten derde heeft een datumconstante een tijdcomponent. Als er geen is opgegeven, is het middernacht op de datum. Dus de uitdrukking:
"Date" BETWEEN '2014-04-11' AND '2014-04-12'
Is echt:
"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
Dat wil zeggen, er wordt precies één keer vanaf de latere datum meegerekend, het eerste moment om middernacht. Dit is meestal niet wat je wilt. Oracle maakt dit probleem op twee manieren erger:
- De
date
gegevenstype bevat een tijdcomponent. - De standaardmanier om
date
te presenteren waarden heeft geen tijdcomponent.
Gebruik dus om het veiligst te zijn de volgende regels:
- Gebruik
between
not niet op data. - Gebruik
>=
voor de eerste date. - Gebruiker
<
voor de tweede.
Aaron Bertrand heeft een blog
precies over dit onderwerp. Hoewel het specifiek over SQL Server gaat, zijn veel van de ideeën van toepassing op Oracle -- vooral omdat de date
gegevenstype in Oracle omvat tijden.