Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Daten zwischen zwei Daten suchen (Best Practice)

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:

  1. Das date Datentyp enthält eine Zeitkomponente.
  2. 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.