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).
Utilisez str_to_date()
pour gérer la conversion.
str_to_date('2016-12-4', '%Y-%m-%d');
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.
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