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

Trovare date comprese tra due date (Best practice)

Stai chiedendo le migliori pratiche. Penso che la seguente sia la migliore pratica:

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

Per prima cosa, nota l'uso di DATE parola chiave. La tua domanda riguarda le date eppure stai utilizzando un formato data che Oracle non supporta direttamente. Fortunatamente, Oracle supporta lo standard ANSI DATE parola chiave con il formato standard ISO.

In secondo luogo, ho aggiunto un +1 quindi puoi vedere la fine del periodo di tempo, che è presumibilmente quello che vuoi vedere nel codice. Non dovrebbe influire sulle prestazioni perché + 1 è su una costante.

Terzo, una costante di data ha una componente temporale. Quando nessuno è specificato, è mezzanotte della data. Quindi, l'espressione:

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

È davvero:

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

Cioè, è inclusa esattamente un'ora dalla data successiva, il primo istante a mezzanotte. Di solito non è quello che vuoi. Oracle aggrava questo problema in due modi:

  1. La date il tipo di dati include una componente temporale.
  2. Il modo predefinito di presentare date i valori non hanno componenti temporali.

Quindi, per essere più sicuri, usa le seguenti regole:

  • Non utilizzare between nelle date.
  • Usa >= per il primo appuntamento.
  • Utente < per la seconda.

Aaron Bertrand ha un blog proprio su questo argomento. Sebbene riguardi specificamente SQL Server, molte delle idee si applicano a Oracle, soprattutto perché la date il tipo di dati in Oracle include i tempi.