web-dev-qa-db-fra.com

Comment les valeurs DATETIME fonctionnent-elles dans SQLite?

Je crée des applications Android et devez enregistrer la date et l'heure de l'enregistrement de création. La documentation SQLite indique toutefois que "SQLite ne dispose pas d'une classe de stockage réservée au stockage des dates et/ou times "et il est" capable de stocker des dates et des heures en tant que valeurs TEXT, REAL ou INTEGER ".

Existe-t-il une raison technique pour utiliser un type plutôt qu'un autre? Et une seule colonne peut-elle stocker des dates dans l’un des trois formats, de rangée à rangée?

J'aurai besoin de comparer les dates plus tard. Par exemple, dans mes applications, je vais afficher tous les enregistrements créés entre la date A et la date B. Je crains que le fait de ne pas avoir une colonne DATETIME réelle puisse rendre les comparaisons difficiles.

101
Khairil Ushan

SQlite n'a pas de type de date/heure spécifique. Vous pouvez utiliser les types TEXT, REAL ou INTEGER, selon vos besoins.

Tout droit des DOCS

SQLite n'a pas de classe de stockage réservée pour stocker des dates et/ou des heures. Au lieu de cela, les fonctions de date et d’heure intégrées de SQLite sont capables de stocker des dates et des heures sous forme de valeurs TEXT, REAL ou INTEGER:

  • TEXT sous forme de chaînes ISO8601 ("AAAA-MM-JJ HH: MM: SS.SSS").
  • RÉEL en nombre de jours juliens, le nombre de jours écoulés depuis midi à Greenwich le 24 novembre 4714 av. selon le calendrier proleptique grégorien.
  • INTEGER en temps Unix, le nombre de secondes depuis le 1970-01-01 00:00:00 UTC.

Les applications peuvent choisir de stocker les dates et les heures dans l’un de ces formats et de convertir librement ces formats en utilisant les fonctions de date et d’heure intégrées.

Les fonctions Date et Heure intégrées à SQLite peuvent être trouvées ici .

77
neo108

SQLite n'a pas de classe de stockage réservée pour stocker des dates et/ou des heures. Au lieu de cela, les fonctions de date et d’heure intégrées de SQLite sont capables de stocker des dates et des heures sous forme de valeurs TEXT, REAL ou INTEGER:

TEXT sous forme de chaînes ISO8601 ("AAAA-MM-JJ HH: MM: SS.SSS"). RÉEL en nombre de jours juliens, le nombre de jours écoulés depuis midi à Greenwich le 24 novembre 4714 av. selon le calendrier proleptique grégorien. INTEGER en temps Unix, le nombre de secondes depuis le 1970-01-01 00:00:00 UTC. Les applications peuvent choisir de stocker les dates et les heures dans l’un de ces formats et de convertir librement ces formats en utilisant les fonctions de date et d’heure intégrées.

Ceci dit, je voudrais utiliser ENTIER et stocker les secondes depuis Unix Epoch (1970-01-01 00:00:00 UTC).

18

Une des fonctionnalités puissantes de SQLite vous permet de choisir le type de stockage. Avantages/inconvénients de chacune des trois possibilités différentes:

  • Chaîne ISO8601

    • La comparaison de chaînes donne des résultats valides
    • Stocke des fractions de secondes, jusqu'à trois chiffres décimaux
    • Besoin de plus d'espace de stockage
    • Vous verrez directement sa valeur lorsque vous utilisez un navigateur de base de données
    • Besoin d'analyser d'autres utilisations
    • Le modificateur de colonne "default current_timestamp" sera stocké en utilisant ce format
  • Nombre réel

    • Haute précision concernant les fractions de seconde
    • Plus longue plage de temps
  • Nombre entier

    • Plus petit espace de stockage
    • Opérations rapides
    • Petit intervalle de temps
    • Problème possible pour l'année 2038

Si vous devez comparer différents types ou exporter vers une application externe, vous êtes libre d'utiliser les propres fonctions de conversion datetime de SQLite .

10
Zso

Pour la quasi-totalité des questions de date et d’heure, je préfère simplifier les choses, très, très simple ... Jusqu’à quelques secondes stockées dans des entiers.

Les entiers seront toujours pris en charge en tant qu'entiers dans les bases de données, les fichiers plats, etc. Vous faites un peu de calcul, vous le transformez en un autre type et vous pouvez formater la date comme vous le souhaitez.

En procédant de cette façon, vous n’aurez plus à vous inquiéter si [insérer la base de données de vos favoris actuels ici] est remplacé par [future base de données de favoris] qui, comme par hasard, n’a pas utilisé le format de date que vous avez choisi aujourd’hui.

C'est juste un peu de surcharge mathématique (par exemple. Méthodes - prend deux secondes, je posterai un Gist si nécessaire) et simplifie les choses pour beaucoup d'opérations concernant la date/heure plus tard.

6
KelvinEWilliams

Stockez-le dans un champ de type long. Voir Date.getTime() et new Date(long)

5
koem