sql >> Databáze >  >> RDS >> Oracle

Vyhledání dat mezi dvěma daty (Osvědčený postup)

Žádáte o osvědčené postupy. Myslím, že následující je nejlepší postup:

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

Nejprve si povšimněte použití DATE klíčové slovo. Vaše otázka se týká dat a přesto používáte formát data, který Oracle přímo nepodporuje. Oracle naštěstí podporuje standard ANSI DATE klíčové slovo ve standardním formátu ISO.

Za druhé jsem přidal +1 takže můžete vidět konec časového období, což je pravděpodobně to, co chcete vidět v kódu. Nemělo by to mít vliv na výkon, protože + 1 je konstantní.

Za třetí, datová konstanta má časovou složku. Není-li zadána žádná, je v den půlnoc. Takže výraz:

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

Je opravdu:

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

To znamená, že je zahrnut přesně jeden čas z pozdějšího data, první okamžik o půlnoci. To obvykle není to, co chcete. Oracle tento problém zhoršuje dvěma způsoby:

  1. date datový typ zahrnuje časovou složku.
  2. Výchozí způsob prezentace date hodnoty nemají žádnou časovou složku.

Abyste byli v bezpečí, použijte následující pravidla:

  • Nepoužívejte between na datech.
  • Použijte >= na první rande.
  • Uživatel < za druhé.

Aaron Bertrand má blog přesně na toto téma. Ačkoli se jedná konkrétně o SQL Server, mnoho myšlenek platí pro Oracle - zejména proto, že date datový typ v Oracle zahrnuje časy.



  1. Transponujte dotaz MySQL - potřebujete řádky do sloupců

  2. Jak funguje MYSQL Self-Join?

  3. Přidání zalomení řádku do textu MySQL INSERT INTO

  4. Jak mohu nastavit relaci v databázi codeigniter 3?