2010-09-07 15 views
5

Estoy trabajando en una base de datos que almacena fechas en un campo mysql varchar(10) (tan triste).Mysql: fecha de conversión de 'dd/mm/aaaa' a 'aaaammdd'

No puedo modificar la estructura de la base de datos (estoy construyendo un pequeño complemento), pero tengo que consultar la base de datos encontrando filas donde este campo de datos está entre los próximos 10 días.

Ejemplo:

| fid | fdate  | 
| 1 | 10/09/2010 | 
| 2 | 17/09/2010 | 
| 3 | 19/09/2010 | 

Tengo que las filas con fid 1 y 2, becose la fecha es < = ahora + 10 días.

Por lo general hago este tipo de consulta:

SELECT fid FROM table WHERE fdate <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

O, si la fecha está en el formato AAAAMMDD ` ':

SELECT fid FROM table WHERE fdate <= DATE_FORMAT(NOW(), '%Y%m%d'); 

pero son inútiles con el formato dd/mm/yyyy.

que he descubierto con

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); 

pero supongo que es un poco una exageración reconstruir el formato de fecha con concat y subcadena, y la cláusula having no ayudará la velocidad de las consultas.

¿Alguna idea?

EDITAR

Después de comentario de Adriano, la solución adecuada es

SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

, así que puede evitar la cláusula concat y tener.

+0

Puede usar 'where' en lugar de' having', pero de lo contrario parece que ha resuelto el problema-- entonces, ¿qué está preguntando exactamente? – Andomar

+0

En la última consulta que publiqué, no puedo usar 'WHERE' en lugar de' HAVING', porque el campo 'mydate' no existe realmente en la tabla cuando se ejecuta la cláusula' WHERE'. – Strae

Respuesta

7

¿Qué hay de usar str_to_date() para crear una fecha a partir de su formato?

EDITAR después de leer su comentario, he creado una tabla como la suya:

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

y luego hice

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

parece funcionar. ¿Qué es exactamente lo que obtienes?

+0

Probado, en el ejemplo funciona con coma (07,09,2010) pero no con barras (07/09/2010) ese es mi caso ... tengo que reemplazar primero '/ 'con', ', luego str_to_date – Strae

+0

El ejemplo también muestra 'SELECT STR_TO_DATE ('04/31/2004 ','% m /% d /% Y ');' trabajando. –

+0

Oooops tienes razón, solía escribir el formato incorrecto, como '% m-% d-% Y' en lugar de'% m /% d /% Y'! gracias chicos – Strae

Cuestiones relacionadas