Pergunta

Eu preciso armazenar itens com uma data do calendário (apenas o dia, sem tempo) em um banco de dados SQLite. Qual é a melhor maneira de representar a data na coluna? dias Julian e segundos unix vêm à mente como alternativas razoáveis. Se eu ir com uma unidade diferente de dias em que momento relógio deve ser?

Update: Estou ciente de ISO8601 e realmente é utilizado para armazenar a data como uma string no formato AAAA-MM-DD para o protótipo. Mas por várias aritmética tenho de convertê-lo para algum número internamente, então eu prefiro para armazenar um número e apenas converter a string para exibição. O que unidades devem este número estar em, com o que origem, e se as unidades é mais preciso do que dias que hora do dia devem ser usados?

Foi útil?

Solução

Se você espera estar entregando a data para uma ferramenta externa ou biblioteca, você deve usar qualquer formato que espera. tempo Unix parece ser a língua franca da horography digitais, por isso é um bom padrão se as circunstâncias externas não fazer a escolha para você.

ISO 8601 podem ser de interesse.

Editar:

Mas por várias aritmética tenho de convertê-lo para algum número internamente, então eu prefiro para armazenar um número e apenas converter a string para exibição.

Ah, isso faz sentido. Se o seu ambiente (.NET? Python? C ++?) Tem ferramentas de manipulação de tempo, seria melhor usar sua unidade nativa e época. Não há nenhuma razão para re-escrever todas essas funções data de manipulação; Eles são mais complicados do que parecem. Caso contrário, eu usaria dias no calendário local (gregoriano?) Desde uma época razoável para a sua aplicação. Seja generoso, você não quer um bug Y2K inversa quando de repente você precisa lidar com uma data mais cedo do que você jamais esperava.

A hora do dia é inteiramente uma questão de gosto. Meia-noite parece ser a escolha mais limpa (todos os zeros na hora, minuto, segundo campos), mas uma vez que nunca atinge o usuário não há nenhuma implicações práticas. Seria um bom local para um ovo de Páscoa, na verdade.

Outras dicas

Se você quiser cobrir suas bases certifique-se de armazenar a data em UTC e escolher um padrão ISO. Esta abordagem requer o mínimo de esforço e irá proteger o seu código de futuras dores de cabeça Interop. Concordo com @skymt ISO 8601 é uma boa escolha.

Se você estiver usando C ++, em seguida, boost :: date_time é olhar um bem a pena.

"Best" quase inteiramente depende de onde as datas vêm de (NSDate objetos, alguns feed XML) e como eles são manipulados (simplesmente armazenada como é vs. fazer alguma aritmética como "dias até").

Eu não estou necessariamente recomendar este, mas eu escrevi um aplicativo que também necessário para armazenar data-mas-não-tempo em um SQLite DB. Na primeira eu usei duas colunas, mês e dia, onde o mês foi definido como o número de meses desde Janeiro de 2000. Eu precisava fazer valer de uma linha-por-data, então eu definido um índice exclusivo entre essas duas colunas, e descobriu-se para fazer atualizações terrivelmente lento.

Para a minha segunda tentativa, eu usei um esquema semelhante, mas codificado a data em um número, usando o fundo de 5 bits para o dia e os restantes bits superiores para o mês (de novo, desde janeiro 2000). As funções de conversão foram:

Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date

Este esquema preserva a ordem numérica em datas e torna mais fácil de dividi-los em componentes. Fazia sentido para o meu aplicativo, porque eu estava armazenando dados em partes mensais. Se, dada uma data, você quer encontrar a próxima data, este esquema pode não ser o melhor, desde a Data + 1 não pode ser uma data válida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top