sql >> Databasteknik >  >> RDS >> Oracle

Hitta datum mellan två datum (bästa praxis)

Du ber om bästa praxis. Jag tror att följande är den bästa praxis:

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

Lägg först märke till användningen av DATE nyckelord. Din fråga handlar om datum och ändå använder du ett datumformat som Oracle inte direkt stöder. Lyckligtvis stödjer Oracle ANSI-standarden DATE nyckelord med ISO-standardformatet.

För det andra lade jag till en +1 så att du kan se slutet av tidsperioden, vilket förmodligen är vad du vill se i koden. Det bör inte påverka prestanda eftersom + 1 är på en konstant.

För det tredje har en datumkonstant en tidskomponent. När ingen anges är det midnatt på datumet. Så uttrycket:

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

Är verkligen:

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

Det vill säga att exakt en tid från det senare datumet ingår, första ögonblicket vid midnatt. Detta är vanligtvis inte vad du vill. Oracle gör det här problemet värre på två sätt:

  1. date datatypen innehåller en tidskomponent.
  2. Standardsättet att presentera date värden har ingen tidskomponent.

Så, för att vara säkrast, använd följande regler:

  • Använd inte between på datum.
  • Använd >= för första dejten.
  • Användare < för den andra.

Aaron Bertrand har en blogg om just detta ämne. Även om det specifikt handlar om SQL Server, är många av idéerna tillämpliga på Oracle -- särskilt eftersom date datatyp i Oracle inkluderar tider.



  1. Bästa datatypen för att lagra pengar i MySQL

  2. Distinkt slumpmässig tidsgenerering i det fasta intervallet

  3. Ingen dialektmappning för JDBC-typ:2003

  4. Välj kolumnnamn vars poster inte är null