Je crée des applications Android et je dois enregistrer la date / l'heure de l'enregistrement de création. La documentation SQLite dit, cependant, "SQLite n'a pas de classe de stockage réservée pour stocker les dates et / ou les heures" et il est "capable de stocker les dates et les heures sous forme de valeurs TEXT, REAL ou INTEGER".
Y a-t-il une raison technique d'utiliser un type plutôt qu'un autre? Et une seule colonne peut-elle stocker des dates dans l'un des trois formats d'une ligne à l'autre?
J'aurai besoin de comparer les dates plus tard. Par exemple, dans mes applications, je montrerai tous les enregistrements créés entre la date A et la date B. Je crains que le fait de ne pas avoir une véritable colonne DATETIME puisse rendre les comparaisons difficiles.
Réponses:
SQlite n'a pas de type de date / heure spécifique. Vous pouvez utiliser
TEXT
,REAL
ouINTEGER
types, selon vos besoins.Directement du DOCS
Les fonctions de date et d'heure intégrées à SQLite sont disponibles ici .
la source
Cela dit, j'utiliserais INTEGER et stockerais les secondes depuis l'époque Unix (1970-01-01 00:00:00 UTC).
la source
RSQLite
semble se convertirPOSIXct
à l'époque numérique, donc cela fonctionne assez bien pour moi.L'une des fonctionnalités puissantes de SQLite vous permet de choisir le type de stockage. Avantages / inconvénients de chacune des trois possibilités:
Chaîne ISO8601
Nombre réel
Nombre entier
Si vous avez besoin de comparer différents types ou d'exporter vers une application externe, vous êtes libre d'utiliser les propres fonctions de conversion datetime de SQLite si nécessaire.
la source
localtime_r()
( sqlite.org/lang_datefunc.html#caveats_and_bugs ) dans l'implémentation de référence, etlocaltime()
peut potentiellement être vulnérable à 2038 si la plate-forme hôte a un fichier 32 bitstime_t
. Cela dit, étant donné que SQLite prétend se prémunir contre cette possibilité en mappant des dates extérieures dans une plage sûre avant la conversion (voir le même lien), je pense que cela ne posera probablement pas de problème, sauf peut-être dans des cas ésotériques.Pour pratiquement toutes les questions de date et d'heure, je préfère simplifier les choses, très, très simple ... Jusqu'à quelques secondes stockées en nombres entiers.
Les entiers seront toujours pris en charge en tant que nombres entiers dans les bases de données, les fichiers plats, etc. Vous faites un peu de calcul et le transtypez dans un autre type et vous pouvez formater la date comme vous le souhaitez.
En procédant de cette façon, vous n'avez pas à vous inquiéter lorsque [insérer la base de données favorite actuelle ici] est remplacé par [future base de données préférée] qui, par coïncidence, n'utilisait pas le format de date que vous avez choisi aujourd'hui.
C'est juste un peu de surcharge mathématique (par exemple, les méthodes - prend deux secondes, je posterai un résumé si nécessaire) et simplifie les choses pour de nombreuses opérations concernant la date / heure plus tard.
la source
Stockez-le dans un champ de type
long
. VoirDate.getTime()
etnew Date(long)
la source