Estou criando aplicativos Android e preciso salvar a data / hora do registro de criação. Os documentos SQLite dizem, entretanto, "SQLite não tem uma classe de armazenamento separada para armazenar datas e / ou horas" e é "capaz de armazenar datas e horas como valores TEXTO, REAL ou INTEGER".
Existe uma razão técnica para usar um tipo em vez de outro? E uma única coluna pode armazenar datas em qualquer um dos três formatos, linha a linha?
Vou precisar comparar as datas mais tarde. Por exemplo, em meus aplicativos, mostrarei todos os registros criados entre a data A até a data B. Estou preocupado porque não ter uma coluna DATETIME verdadeira pode dificultar as comparações.
Respostas:
SQlite não tem um tipo específico de data e hora. Você pode usar
TEXT
,REAL
ouINTEGER
tipos, o que se adapte às suas necessidades.Direto do DOCS
As funções internas de data e hora do SQLite podem ser encontradas aqui .
fonte
Dito isso, eu usaria INTEGER e armazenaria os segundos desde a época do Unix (1970-01-01 00:00:00 UTC).
fonte
RSQLite
parece estar se convertendoPOSIXct
em época numérica, então funciona bem o suficiente para mim.Um dos recursos poderosos do SQLite é permitir que você escolha o tipo de armazenamento. Vantagens / desvantagens de cada uma das três possibilidades diferentes:
String ISO8601
Número real
Número inteiro
Se você precisar comparar diferentes tipos ou exportar para um aplicativo externo, você está livre para usar as próprias funções de conversão de data e hora do SQLite conforme necessário.
fonte
localtime_r()
( sqlite.org/lang_datefunc.html#caveats_and_bugs ) na implementação de referência elocaltime()
pode ser potencialmente vulnerável a 2038 se a plataforma host tiver um de 32 bitstime_t
. Dito isso, uma vez que o SQLite afirma se proteger contra essa possibilidade mapeando datas externas em uma pré-conversão de intervalo seguro (consulte o mesmo link), acho improvável que seja um problema, exceto talvez em casos esotéricos.Para praticamente todas as questões de data e hora eu prefiro simplificar as coisas, muito, muito simples ... Baixar para segundos armazenados em inteiros.
Inteiros sempre serão suportados como inteiros em bancos de dados, arquivos simples, etc. Você faz um pouco de matemática e converte em outro tipo e pode formatar a data da maneira que quiser.
Fazendo desta forma, você não precisa se preocupar quando [inserir banco de dados favorito atual aqui] for substituído por [banco de dados favorito futuro] que coincidentemente não usou o formato de data que você escolheu hoje.
É apenas uma pequena sobrecarga matemática (por exemplo, métodos - leva dois segundos, postarei uma ideia geral se necessário) e simplifica as coisas para muitas operações relacionadas a data / hora posteriormente.
fonte
Armazene-o em um campo do tipo
long
. VejaDate.getTime()
enew Date(long)
fonte