sql >> Database teknologi >  >> RDS >> Oracle

Find datoer mellem to datoer (bedste praksis)

Du beder om bedste praksis. Jeg tror, ​​at følgende er den bedste praksis:

"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1

Bemærk først brugen af ​​DATE søgeord. Dit spørgsmål handler om datoer og alligevel bruger du et datoformat, som Oracle ikke direkte understøtter. Heldigvis understøtter Oracle ANSI-standarden DATE søgeord med ISO-standardformatet.

For det andet tilføjede jeg en +1 så du kan se slutningen af ​​tidsperioden, hvilket formentlig er det, du vil se i koden. Det bør ikke påvirke ydeevnen, fordi + 1 er på en konstant.

For det tredje har en datokonstant en tidskomponent. Når ingen er angivet, er det midnat på datoen. Så udtrykket:

"Date" BETWEEN '2014-04-11' AND '2014-04-12'

Er virkelig:

"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'

Det vil sige, at præcis én gang fra den senere dato er inkluderet, det første øjeblik ved midnat. Det er normalt ikke det, du ønsker. Oracle gør dette problem værre på to måder:

  1. date datatypen inkluderer en tidskomponent.
  2. Standardmåden at præsentere date på værdier har ingen tidskomponent.

Så for at være sikrest, brug følgende regler:

  • Brug ikke between på datoer.
  • Brug >= til den første date.
  • Bruger < for det andet.

Aaron Bertrand har en blog om netop dette emne. Selvom det specifikt handler om SQL Server, gælder mange af ideerne for Oracle -- især fordi date datatypen i Oracle inkluderer tider.



  1. Dynamisk rækkevidde under hentning af poster fra databasen

  2. mysql_fetch_array og while loop i php

  3. Ulovlig blanding af sammenstillingsfejl fra MySql under kørsel af rails-testsuite

  4. Hvornår kører SQLiteOpenHelper onCreate() / onUpgrade()?