Žá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:
date
datový typ zahrnuje časovou složku.- 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.