Eu tenho um conjunto de horários de início e término que preciso armazenar em um banco de dados Oracle. Eu preciso armazená-los de uma maneira que os torne facilmente pesquisáveis (ou seja, uma pesquisa típica é encontrar todas as linhas em que um valor de tempo, como 9h30, fica entre o horário de início e o horário de término). No SQL Server, eu usaria apenas um campo de tipo de dados TIME, mas o Oracle não parece ter um equivalente.
Já vi vários blogs e fóruns que recomendam apenas usar um campo DATE e fazer conversões com TO_CHAR e depois comparar ou armazenar os valores de tempo como campos varchar(4 / HHMM) ou varchar(6 / HHMMSS). Ambos parecem desnecessariamente ineficientes.
Existe uma maneira melhor ou mais eficiente de fazer isso no Oracle?
Se você não precisa armazenar o componente de data, então an
interval day(0) to second
é a abordagem mais prática. A maior vantagem vem se você precisar fazer cálculos para descobrir quanto tempo se passou entre duas vezes, pois não precisa fazer nenhum processamento extra fora da caixa.Por exemplo:
Você também tem funções padrão para extrair os vários componentes da hora (hora, minuto, etc.):
Tente armazenar como número. O pior caso é 3 bytes para HHMM e 4 para HHMMSS. 01:00 levaria 1 byte.
Fiz alguns testes usando o oracle 11g e obtive isso:
Então eu iria para a DATA ou NÚMERO se eu puder. É mais rápido e menor. Apenas certifique-se de ignorar a parte DAY do seu encontro, se não precisar.
Eu estava procurando o mesmo cenário de armazenar hh:mm (ou hhmm) em uma coluna do oráculo. Eu tentei o exemplo acima (de carregar dados na tabela de tempo) e descobri que, como usamos o gerador de valor aleatório, ele está armazenando dados 12.0 em vez de 12.00 na coluna hoursText (que é varchar). Também acho que as consultas não estão usando índices, pois temos funções definidas na coluna no
Acho que não precisamos dessa conversão para to_date. Por que não:
Acho que essa consulta usará o índice e retornará os resultados rapidamente.