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.
Puede usar 'where' en lugar de' having', pero de lo contrario parece que ha resuelto el problema-- entonces, ¿qué está preguntando exactamente? – Andomar
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