Question

Je dois stocker dans une base de données sqlite des éléments comportant une date (juste le jour, pas le jour). Quelle est la meilleure façon de représenter la date dans la colonne? Les jours juliens et les secondes unix viennent à l’esprit comme des alternatives raisonnables. Si je vais avec une unité autre que les jours à quelle heure devrait-il être?

Mise à jour: Je connais ISO8601 et l’utilise réellement pour stocker la date sous forme de chaîne au format AAAA-MM-JJ pour le prototype. Mais pour diverses arithmétiques, je dois le convertir en un certain nombre en interne, je préférerais donc stocker un nombre et simplement convertir en chaîne pour l'affichage. Dans quelles unités ce nombre doit-il figurer, avec quelle origine et si les unités sont plus précises que les jours, quelle heure de la journée devrait être utilisée?

Était-ce utile?

La solution

Si vous envisagez de transmettre la date à un outil externe ou à une bibliothèque, vous devez utiliser le format souhaité. L’heure Unix semble être la lingua franca de l’horographie numérique, c’est donc un bon choix par défaut si des circonstances extérieures ne vous le permettent pas.

ISO 8601 pourrait présenter un intérêt.

Modifier:

  

Mais pour diverses arithmétiques, je dois le convertir en un certain nombre en interne, je préférerais donc stocker un nombre et simplement le convertir en chaîne pour l'affichage.

Ah, ça a du sens. Si votre environnement (.NET? Python? C ++?) Dispose d’outils de gestion du temps, il serait préférable d’utiliser leur unité et époque natives. Il n'y a aucune raison de réécrire toutes ces fonctions de manipulation de date; ils sont plus compliqués qu'ils n'en ont l'air. Sinon, j'utiliserais des jours dans le calendrier local (grégorien?) Depuis une époque raisonnable pour votre application. Soyez généreux, vous ne voulez pas d’un bogue inversé de l’an 2000 lorsque vous devez soudainement traiter une date plus tôt que prévu.

L’heure de la journée est une question de goût. Minuit semble être le choix le plus propre (tous les zéros dans les champs heure, minute, deuxième), mais comme il n’atteint jamais l’utilisateur, il n’ya aucune implication pratique. Ce serait un bon endroit pour un oeuf de Pâques, en fait.

Autres conseils

Si vous souhaitez couvrir vos bases, assurez-vous de stocker la date dans utc et de choisir une norme ISO. Cette approche nécessite un minimum d’efforts et protégera votre code des futurs maux de tête Interop. Je suis d'accord avec @skymt ISO 8601 est un bon choix.

Si vous utilisez C ++, alors boost :: date_time vaut la peine d'être examiné.

" Best " presque entièrement dépend de la provenance des dates (objets NSDate, de certains flux XML) et de la manière dont elles sont manipulées (simplement stockées telles quelles ou en utilisant une arithmétique comme "jours jusqu'à").

Je ne le recommande pas nécessairement, mais j'ai écrit une application qui devait également stocker la date mais pas l'heure dans une base de données SQLite. Au début, j’ai utilisé deux colonnes, Month et Day, mois étant défini comme le nombre de mois depuis janvier 2000. J’ai dû appliquer une ligne par date, j’ai donc défini un index UNIQUE sur ces deux colonnes. faire des mises à jour horriblement lente.

Lors de ma deuxième tentative, j’ai utilisé un schéma similaire, mais codé la date en un seul nombre, en utilisant les 5 derniers bits du jour et les derniers bits du mois (encore une fois, depuis janvier 2000). Les fonctions de conversion étaient les suivantes:

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

Ce schéma préserve l’ordre numérique des dates et facilite leur division en composants. C'était logique pour mon application, parce que je stockais des données dans des morceaux mensuels. Si, avec une date, vous souhaitez rechercher la date suivante, ce schéma pourrait ne pas être le meilleur, car la date + 1 peut ne pas être une date valide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top