Comment pourrais-je stocker une date qui peut être partielle (c'est-à-dire juste l'année, peut-être aussi le mois) et la sortir plus tard avec la même spécificité?

StackOverflow https://stackoverflow.com/questions/90246

Question

Je souhaite que les utilisateurs spécifient une date pouvant inclure ou non un jour et un mois (mais ayant au moins l'année). Le problème réside dans le moment où il est stocké en tant que date / heure dans la base de données; le jour / mois manquant sera enregistré comme valeur par défaut et je perdrai le format et la signification d'origine de la date.

Mon idée était de stocker le format réel dans une colonne sous forme de chaîne en plus de la colonne datetime. Ensuite, je pourrais utiliser la colonne de chaîne chaque fois que je dois afficher la date et la date / heure pour tout le reste. L'inconvénient est une colonne supplémentaire pour chaque colonne de date du tableau que je veux afficher, et imprimer des dates localisées ne sera pas aussi facile car je ne peux pas compter sur la valeur datetime ... Je vais probablement devoir analyser la chaîne .

J'espère avoir oublié quelque chose et qu'il pourrait y avoir un moyen plus simple.

(Notez que j'utilise Rails si c'est important pour une solution.)

Était-ce utile?

La solution

Comme proposé par Jhenzie , créez un masque de bits pour indiquer les parties de la date spécifiées. 1 = Année, 2 = Mois, 4 = Jour, 8 = Heure (si vous décidez d’être plus précis) puis stockez-le dans un autre champ.

La seule façon pour moi de le faire sans exiger des colonnes supplémentaires dans votre tableau serait d'utiliser la méthode de jhenzie consistant à utiliser un masque de bits, puis à stocker ce masque dans la partie secondes de votre date et heure. colonne.

Autres conseils

dans votre modèle, ne faites attention qu'aux pièces qui vous intéressent. Vous pouvez donc stocker la date entière dans votre base de données, mais vous la fusionnez avant de l'afficher à l'utilisateur.

La colonne supplémentaire pourrait simplement être utilisée pour spécifier quelle partie de l'heure a été spécifiée

1 = jour 2 = mois 4 = année

donc 3 correspond au jour et au mois, 6 au mois et à l’année, 7 aux trois. c'est un simple int à ce moment-là

Si vous stockez une chaîne, ne réinstallez pas partiellement la norme ISO 8601 qui couvre le cas que vous décrivez et plus encore:

http://en.wikipedia.org/wiki/ISO_8601

Est-il vraiment nécessaire de le stocker en tant que date / heure? S'il n'est pas stocké sous forme de chaîne 2008 ou 2008-8 ou 2008-8-1 - divisez la chaîne en traits d'union lorsque vous le tirez et vous êtes en mesure d'établir la spécificité de l'entrée d'origine

Je stockerais probablement la date et l'heure et une "précision" supplémentaire colonne pour déterminer comment l’afficher. Pour la sortie, la colonne de précision peut être mappée sur une colonne contenant la chaîne de mise en forme correspondante ("AAAA-mm", etc.) ou peut contenir la chaîne de mise en forme elle-même.

Je ne connais pas grand chose à la conception de base de données, mais je pense qu’une solution plus simple consisterait à utiliser des colonnes booléennes indiquant si l’utilisateur a entré le mois et le jour (une colonne pour chaque). Ensuite, pour enregistrer la date donnée, vous devez:

  1. Stocke la date saisie par l'utilisateur dans une colonne datetime;
  2. Définissez la colonne du mois booléen si l'utilisateur a sélectionné un mois;
  3. Définissez la colonne jour booléen si l'utilisateur a choisi un jour.

De cette façon, vous savez à quelles parties de l’heure datetime vous pouvez faire confiance (c’est-à-dire ce qui a été saisi par l’utilisateur).

Edit: il serait également beaucoup plus facile à comprendre qu'un champ int avec des valeurs cryptiques!

La base de données informix dispose de cette fonctionnalité. Lorsque vous définissez un champ de date, vous spécifiez également un masque de la durée souhaitée. attributs de date. Seuls ces champs sont pris en compte lors des comparaisons.

Avec différents niveaux de spécificité, votre meilleur pari est de les stocker sous forme de simples entités nullables. Année mois jour. Vous pouvez encapsuler la logique d'affichage dans votre modèle de présentation ou un objet de valeur dans votre domaine.

Les types d'heure intégrés représentent un instant dans le temps. Vous pouvez utiliser les types intégrés et créer une colonne à des fins de précision (Année, Mois, Jour, Heure, etc.) ou vous pouvez créer votre propre structure de date et utiliser des valeurs NULL (ou une autre valeur non valide) pour les parties vides.

Pour ruby ??au moins - vous pouvez utiliser cette gemme - date partielle https://github.com/58bits/partial-date

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