2010-11-19 84 views
1

J'ai une grande table des anniversaires que je veux convertir d'une colonne de varchar à une colonne de date.MYSQL: Comment convertir une colonne VARCHAR contenant des dates en une colonne DATE?

La table SQL est:

CREATE TABLE `birthdays` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `uid` bigint(20) DEFAULT NULL, 
    `birthday_date` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM 

La date d'anniversaire est stocké dans l'une des deux façons: des chaînes comme « 26/05/1994 » ou parfois « 03/14 » (pour les personnes qui ne le font pas vouloir révéler leur année de naissance).

Quelle est la meilleure façon de créer une autre table et de stocker les anniversaires dans une colonne de date? Est-il possible de faire cela simplement en utilisant MySQL (et d'éviter d'utiliser PHP ou un autre intermédiaire)?

J'ai trouvé une fonction STR_TO_DATE dans MySQL. Devrais-je l'utiliser?

Merci!

+1

Vous ne pouvez pas - date est composé de YYY-MM-DD, les informations manquantes sur l'année seront un problème pour STR_TO_DATE – ajreal

Répondre

2
SELECT IF(birthday_date RLIKE '[0-9]{2}/[0-9]{2}/[0-9]{4}',STR_TO_DATE(birthday_date,'%m/%d/%Y'),STR_TO_DATE(birthday_date,'%m/%d')); 

Ceci donnera des dates comme 0000-03-14 pour les lignes qui n'ont pas d'année. Votre serveur doit être configuré pour autoriser des dates non valides (voir http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html)

+0

Merci! C'est très utile. En général, les dates stockées avec l'année 0000 posent-elles des problèmes? Je n'ai jamais stocké de date ou de date sans une année spécifique auparavant. – eric

+0

Il existe plusieurs problèmes. Le plus évident sera de trier ces dates (elles seront groupées au début). Il y a aussi des problèmes de portabilité - si vous avez besoin de migrer ces données vers un autre serveur, vous devez vous assurer qu'il autorise des dates non valides. La migration vers d'autres SGBDR peut également être difficile. – Mchl

+0

La date minimale prise en charge pour DATETIME est 1000-01-01. Vous pouvez donc utiliser l'année 1000 à la place. – Mchl

1

Si vous convertissez votre colonne en DateTime alors vous ne pourra pas pour stocker des dates comme "03/14" en quelle année est manquante. Donc, à la place, je suggère de garder cela tel quel et probablement avoir une autre colonne pour stocker le dateTime si vous en avez vraiment besoin. Dispose également d'un déclencheur interne pour convertir les chaînes de dates de la colonne varchar en colonne dateTime. Oui, vous devez utiliser la méthode STR_TO_DATE pour votre usage.

+0

Merci pour la réponse. Question générale: Si la table contient des millions de lignes, est-il préférable de stocker les anniversaires en tant que varchar ou d'essayer de les stocker en tant que dates (et éventuellement stocker les anniversaires sans années comme quelque chose comme 03/14/0000)? – eric

+1

@Eric - il est généralement préférable de stocker les dates en tant que champ date-heure, probablement parce que vous aurez un format standard pour l'enregistrement et que vous pourrez facilement comparer avec d'autres dates. Par exemple: - tous les utilisateurs qui sont nés cette année. etc. L'année '0000', je ne sais pas si c'est valide, mais oui vous pouvez donner une valeur vague comme 1500 ou quelque chose. –