sql >> Database >  >> RDS >> Oracle

Datums tussen twee datums zoeken (best practice)

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:

  1. De date gegevenstype bevat een tijdcomponent.
  2. 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.



  1. Dubbele invoer voor primaire sleutel op MySQL

  2. Rails Postgres functionele indexen

  3. Gemiddelde tijd van bewerkingen die in de database zijn opgeslagen

  4. Vind waarden die geen getallen bevatten in MySQL