2009-01-06 7 views
1

Quelle est la meilleure façon de stocker une valeur de date pour laquelle, dans de nombreux cas, seule l'année peut être connue? MySQL autorise les zéros dans les parties de date, sauf si le mode NO_ZEROES_IN_DATE sql est activé, ce qui n'est pas le cas par défaut. Y at-il une raison pour ne pas utiliser un champ de date où le mois et le jour peuvent être zéro, ou pour le diviser en trois champs différents pour l'année, le mois et le jour (année (4), tinyint, tinyint)?Enregistrer une date où seule l'année peut être connue

+0

Connaissez-vous parfois le reste de la date? ou utilisez-vous seulement pour tenir des années? –

+0

oui, il est présumé que le mois et la date peuvent être utilisés dans certains cas –

Répondre

0

Pour ce faire, vous pouvez utiliser un champ de date unique dans Mysql. Dans l'exemple ci-dessous, le champ contient le type de données de date.

mysql> select * from test; 
+------------+------+ 
| field  | id | 
+------------+------+ 
| 2007-00-00 | 1 | 
+------------+------+ 
1 row in set (0.00 sec) 

mysql> select * from test where YEAR(field) = 2007; 
+------------+------+ 
| field  | id | 
+------------+------+ 
| 2007-00-00 | 1 | 
+------------+------+ 

Je voudrais utiliser un champ, il rendra les requêtes plus faciles.

Oui, en utilisant le Date and Time functions serait mieux. Merci BrynJ

+0

le mot-clé similaire en combinaison avec les% principaux résultats dans un balayage de table. Les index ne peuvent pas être utilisés dans cette situation. – NotMe

+0

Bon point, il a bien dit que l'année serait connue, donc là n'est pas nécessaire pour le premier caractère générique, ce serait une limitation à garder à l'esprit. – Mark

+0

est une requête similaire sur une colonne de date optimisée pour utiliser la correspondance d'index de préfixe du tout? Les dates sont stockées en interne sous la forme d'un entier de 3 octets, et non d'une chaîne. Il doit donc être converti en premier. –

2

Une meilleure façon est de diviser la date en 3 champs. Année mois jour. Cela vous donne une flexibilité totale pour le stockage, le tri et la recherche.

De même, il est assez simple de remettre les champs dans un champ de date réel si nécessaire. Enfin, il est portable sur tous les SGBD. Je ne pense pas que quelqu'un d'autre supporte un 0 comme une partie valide d'une valeur de date.

2

À moins que la portabilité à travers le SGBD soit importante, je serais certainement enclin à utiliser un seul champ de date. Si vous avez besoin de requêtes liées à la date, même modérément complexes, le fait d'avoir vos valeurs du jour, du mois et de l'année dans des champs séparés deviendra une corvée.

MySQL a une multitude de fonctions liées à la date - http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html. Utilisez YEAR (yourdatefield) si vous voulez renvoyer uniquement la valeur de l'année, ou la même chose si vous voulez l'inclure dans la clause WHERE de votre requête.

0

Vous pourriez essayer un opérateur LIKE. Tels que: SELECT * FROM table WHERE date_feield LIKE 2009;

0

Cela dépend de la façon dont vous utilisez les données résultantes. Une réponse simple serait de simplement stocker ces dates où seule l'année est connue comme le 1er janvier. Cette approche est vraiment simple et vous permet de regrouper par année en utilisant toutes les fonctions de date intégrées standard.

Le problème se pose si le mois ou la date est significatif. Par exemple, si vous essayez de déterminer l'âge d'un enregistrement en jours, semaines, mois ou si vous souhaitez afficher la distribution à travers ce niveau de granularité plus petit. Ce problème existe cependant. Si vous avez des dates complètes et certaines avec seulement une année, comment voulez-vous les représenter dans de tels cas?

Questions connexes