8
votes

Dois-je me soucier de stocker des données DateTime comme Julianday à Sqlite?

SQLITE DOCS Spécifie que le format préféré pour stocker des valeurs DateTime dans la DB est d'utiliser Julian Day (en utilisant des fonctions intégrées).

Cependant, tous les cadres que j'ai vus dans Python (Pysqlite, Sqlalchemy) Stockez les valeurs DateTime.DateTime en tant que chaînes formatées ISO. Pourquoi le font-ils?

J'essaie habituellement d'adapter les cadres à stocker DateTime comme Julianday, et c'est assez douloureux. J'ai commencé à douter que cela vaut les efforts.

Partagez votre expérience dans ce champ avec moi. Collant avec Julianday a du sens?


0 commentaires

4 Réponses :


6
votes

Julian Day est pratique pour toutes sortes de calculs de date, mais il peut stocker la partie l'heure décennie (avec des heures précises, des minutes et des secondes). Dans le passé, j'ai utilisé les deux champs de jour de Julian (pour les dates) et les secondes à partir de-epoch (pour DateTime instances), mais uniquement lorsque j'avais des besoins spécifiques pour le calcul (des dates et respectivement des fois). La simplicité des dates d'ISO formatées et des denttimes, je pense, devrait leur faire le choix préféré, dire environ 97% du temps.


4 commentaires

Je vais donc rester avec les valeurs par défaut du framework jusqu'à ce que je n'ai pas de raisons explicites de ne pas le faire. Merci!


Pourriez-vous décrire un peu pourquoi la précision de Julianday pendant des heures, des minutes et des secondes n'est pas assez bonne?


@Slava, pensez à représenter "1 seconde": que 1/86400.'th de la journée, qui ne peut pas être représenté avec précision comme la partie fractionnaire d'une double précision, car la représentation de cette dernière est sous forme binaire et 86400 n'est pas une puissance de deux.


Actuellement (entre 1029 et 809-15 et 6771-07-07), la résolution d'une date julienne stockée sous forme d'un double est 2 ** (- 31) jour ≅ 40,2 μs.



5
votes

stocker les deux manières. Les cadres peuvent être définis de leur manière et si le vôtre s'attend à trouver une colonne brute avec une chaîne formatée ISO, c'est probablement plus une douleur à se déplacer qu'autrement.

La préoccupation dans la présence de deux colonnes est la cohérence des données mais SQLite devrait avoir tout ce dont vous avez besoin pour le faire fonctionner. La version 3.3 prend en charge les contraintes de contrôle et les déclencheurs. Lisez sur Fonctions de date et d'heure . Vous devriez être capable de faire ce dont vous avez besoin entièrement dans la base de données. xxx

et si vous ne pouvez pas faire ce dont vous avez besoin dans la DB, vous pouvez écrire une extension C pour effectuer la fonctionnalité. vous avez besoin. De cette façon, vous n'aurez pas besoin de toucher le cadre autre que de charger votre extension.


2 commentaires

Merci pour cette suggestion! C'est une bonne idée et cela résout toute la sorte de mes problèmes avec ce problème.


Pourquoi voudriez-vous vouloir de stocker les deux manières? Le seul véritable avantage de stocker des journées juliennes sur des chaînes iso-formatées est l'espace de stockage. Si votre cadre s'attend à une chaîne iSO formatée, utilisez simplement cela. Tous de SQLite's Fonctions DateTime peut traiter les cordes ISO aussi bien que Julian Jours.



0
votes

parce que 2010-06-22 00:45:56 est beaucoup plus facile pour un homme de lire que 2455369.5318981484 . Les dates de texte sont idéales pour faire des requêtes ad-hoc dans SQLITPY ou SQLITE Manager.

L'inconvénient principal, bien sûr, est que les dates de texte nécessitent 19 octets au lieu de 8.


0 commentaires

1
votes

Mais typiquement, l'homme ne lit pas directement de la base de données. La durée fractionnée sur une journée julienne est facilement convertie en humain lisible par (par exemple) xxx


0 commentaires