web-dev-qa-db-fra.com

Basculez VARCHAR en DATE dans MySQL

J'ai hérité d'une base de données qui a une colonne VARCHAR qui devrait vraiment être une DATE. Il n'y a pas de vérification sur le formulaire (j'ai besoin de corriger cela), donc les dates sont constamment saisies comme 2016-12-4 au lieu de 2016-12-04 et ainsi de suite.

Je suis à peu près sûr qu'il y a historiquement beaucoup de mauvaises dates, donc je suis un peu avisé de simplement changer le type de données en DATE, mais je suis curieux de savoir quelle serait une bonne stratégie pour changer cela?

Contexte: (Je suis un développeur front-end, pas un DBA, donc bien que je puisse me déplacer dans SQL, je ne sais pas ce que je ne sais pas et j'ai toujours peur de faire une erreur qui corrompt le base de données).

6
Robusto

Utilisez str_to_date() pour gérer la conversion.

str_to_date('2016-12-4', '%Y-%m-%d'); 
5
Evan Carroll

SELECT CAST('2016-12-4' AS DATE); -> 2016-12-04, donc vous n'avez pas besoin de str_to_date.

Je voudrais ajouter une nouvelle colonne pour la date (ALTER TABLE .. ADD COLUMN ..); UPDATE pour définir la nouvelle colonne. Ensuite, corrigez manuellement toutes les valeurs vraiment gâchées. Finalement DROP COLUMN et RENAME COLUMN;

ORDER BY a VARCHAR contenant une date peut entraîner des réponses erronées. (Jan et novembre peuvent être confus.) Le test de dates spécifiques peut échouer. (0 manquant au début.)

Et l'indexation de la colonne DATE accélérera certaines requêtes.

4
Rick James

Changer la colonne VARCHAR en colonne DATE n'est pas non plus un problème.

Table de test et données

CREATE TABLE test.t1( `date_start` VARCHAR(20) ); 
INSERT INTO test.test1 VALUES('2016-1-5');
INSERT INTO test.test1 VALUES('2016-1-5');
INSERT INTO test.test1 VALUES('2016-12-5');
INSERT INTO test.test1 VALUES('2016-12-6');

Sélectionnez le résultat de la requête.

SELECT * FROM test.test1

date_start  
------------
2016-1-5    
2016-1-5    
2016-12-5   
2016-12-6   

Modifiez la colonne VARCHAR en DATE

ALTER TABLE test.test1 CHANGE date_start date_start DATE NULL;

Sélectionnez le résultat de la requête.

SELECT * FROM test.test1 

date_start  
------------
2016-01-05  
2016-01-05  
2016-12-05  
2016-12-06  
2
Raymond Nijland