2010-09-07 4 views
5

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.

+0

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

+0

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

Répondre

7

Qu'en est-il de l'utilisation de str_to_date() pour créer une date à partir de votre format?

EDIT après avoir lu votre commentaire, j'ai créé une table comme la vôtre:

mysql> SELECT fid, fdate FROM test; 
+------+------------+ 
| fid | fdate  | 
+------+------------+ 
| 1 | 10/9/2010 | 
| 2 | 17/9/2010 | 
| 3 | 19/09/2010 | 
+------+------------+ 

puis fait

mysql> SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY); 
+------+ 
| fid | 
+------+ 
| 1 | 
| 2 | 
+------+ 

semble fonctionner. Qu'est-ce que vous obtenez exactement?

+0

Essayé, dans l'exemple il fonctionne avec une virgule (07,09,2010) mais pas avec des barres obliques (07/09/2010) c'est mon cas ... je dois donc d'abord remplacer '/ 'par', ', puis str_to_date – Strae

+0

L'exemple montre également 'SELECT STR_TO_DATE ('04/31/2004 ','% m /% d /% Y ');' travail. –

+0

Oooops votre droit, j'avais l'habitude d'écrire le format faux, comme '% m-% d-% Y' au lieu de'% m /% d /% Y'! Merci les gars – Strae

Questions connexes