Você está pedindo as melhores práticas. Acho que o seguinte é a melhor prática:
"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
Primeiro, observe o uso do
DATE
palavra-chave. Sua pergunta é sobre datas e ainda assim você está usando um formato de data que o Oracle não suporta diretamente. Felizmente, a Oracle suporta o padrão ANSI DATE
palavra-chave com o formato padrão ISO. Segundo, adicionei um
+1
para que você possa ver o final do período de tempo, que provavelmente é o que você deseja ver no código. Não deve afetar o desempenho porque o + 1
está em uma constante. Terceiro, uma constante de data tem um componente de tempo. Quando nenhum é especificado, é meia-noite na data. Assim, a expressão:
"Date" BETWEEN '2014-04-11' AND '2014-04-12'
É realmente:
"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
Ou seja, exatamente uma hora da data posterior é incluída, o primeiro instante à meia-noite. Isso geralmente não é o que você quer. A Oracle piora esse problema de duas maneiras:
- A
date
tipo de dados inclui um componente de tempo. - A maneira padrão de apresentar
date
valores não tem componente de tempo.
Então, para ser mais seguro, use as seguintes regras:
- Não use
between
em datas. - Usar
>=
para o primeiro encontro. - Usuário
<
para o segundo.
Aaron Bertrand tem um blog exatamente neste tópico. Embora seja especificamente sobre o SQL Server, muitas das ideias se aplicam ao Oracle -- especialmente porque a
date
tipo de dados no Oracle inclui tempos.