Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Encontrar datas entre duas datas (melhor prática)


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:
  1. A date tipo de dados inclui um componente de tempo.
  2. 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.