Je travaille sur une base de données qui stocke les dates dans un champ mysql varchar(10)
(si triste).Mysql: convertir la date de 'jj/mm/aaaa' en 'aaaammjj'
Je ne peux pas modifier la structure de la base de données (en construisant un petit plug-in), mais je dois interroger la base de données pour trouver des lignes où ce champ de données est entre les 10 prochains jours.
Exemple:
| fid | fdate |
| 1 | 10/09/2010 |
| 2 | 17/09/2010 |
| 3 | 19/09/2010 |
Je dois obtenir les lignes avec fid 1 et 2, la date est becose < = maintenant + 10 jours.
Habituellement je faire ce genre de requête:
SELECT fid FROM table WHERE fdate <= DATE_ADD(NOW(), INTERVAL 10 DAY);
Ou, si la date est dans le format `yyyymmdd ':
SELECT fid FROM table WHERE fdate <= DATE_FORMAT(NOW(), '%Y%m%d');
Mais theyre inutile avec le format dd/mm/yyyy
.
J'ai compris avec
SELECT fid, CONCAT(SUBSTRING(fdate, 7, 4), SUBSTRING(fdate, 4, 2), SUBSTRING(fdate, 1, 2)) AS mydate FROM table HAVING mydate <= DATE_ADD(NOW(), INTERVAL 10 DAY);
mais je suppose que c'est un peu une surpuissance reconstruction du format de date avec concat et sous-chaîne, et la clause having
aidera pas la vitesse de la requête.
Une idée?
EDIT
Après le commentaire de Adriano, la bonne solution est
SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY);
afin que je puisse éviter le concat et avoir la clause.
Vous pouvez utiliser 'where' au lieu de' having', mais sinon vous semblez avoir résolu le problème - alors qu'est-ce que vous demandez exactement? – Andomar
Dans la dernière requête que j'ai posté, je ne peux pas utiliser 'WHERE' au lieu de' HAVING', car le champ 'mydate' n'existe pas réellement dans la table quand la clause' WHERE' est exécutée. – Strae