Sie fragen nach Best Practices. Ich denke, das Folgende ist die beste Vorgehensweise:
"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
Beachten Sie zunächst die Verwendung des DATE
Stichwort. Ihre Frage bezieht sich auf Daten und dennoch verwenden Sie ein Datumsformat, das Oracle nicht direkt unterstützt. Glücklicherweise unterstützt Oracle den ANSI-Standard DATE
Schlüsselwort im ISO-Standardformat.
Zweitens habe ich ein +1
hinzugefügt Sie können also das Ende des Zeitraums sehen, was Sie vermutlich im Code sehen möchten. Es sollte die Leistung nicht beeinträchtigen, da + 1
ist konstant.
Drittens hat eine Datumskonstante eine Zeitkomponente. Wenn nichts angegeben ist, ist es Mitternacht am Datum. Also der Ausdruck:
"Date" BETWEEN '2014-04-11' AND '2014-04-12'
Ist wirklich:
"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
Das heißt, genau ein Zeitpunkt ab dem späteren Datum ist enthalten, der erste Zeitpunkt um Mitternacht. Dies ist normalerweise nicht das, was Sie wollen. Oracle verschlimmert dieses Problem auf zwei Arten:
- Das
date
Datentyp enthält eine Zeitkomponente. - Die Standarddarstellung von
date
Werte haben keine Zeitkomponente.
Verwenden Sie daher sicherheitshalber die folgenden Regeln:
- Verwenden Sie nicht
between
an Terminen. - Verwenden Sie
>=
für das erste Date. - Benutzer
<
für die zweite.
Aaron Bertrand hat einen Blog
zu genau diesem Thema. Obwohl es speziell um SQL Server geht, gelten viele der Ideen für Oracle – insbesondere wegen des date
Der Datentyp in Oracle enthält Zeiten.