views:

34

answers:

1

Im working on a database that store dates in a varchar(10) mysql field (so sad).

I can not alter the database structure (im building a small plug-in), but i have to query the database finding rows where this data field is between the next 10 days.

Example:

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

I have to get the rows with fid 1 and 2, becose the date is <= now + 10 days.

Usually i make this kind of query:

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

Or, if the date is in the format `yyyymmdd':

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

But theyre useless with the format dd/mm/yyyy.

I've figured out with

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

but i guess it is a bit an overkill rebuilding the date format with concat and substring, and the having clause wont help the query speed.

Any idea?

EDIT

After Adriano's comment, the right solution is

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

so i can avoid the concat and having clause.

+2  A: 

What about using str_to_date() to create a date from your format?

EDIT after reading your comment, I created a table like yours:

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

and then did

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

Seems to work. What exactly do you get?

Adriano Varoli Piazza
Tryed, in the example it works with comma (07,09,2010) but not with slashes (07/09/2010) that's my case...i have then to first replace '/` with `,`, then str_to_date
DaNieL
The example shows also `SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');` working.
Adriano Varoli Piazza
Oooops youre right, i used to wrote the format wrong, as `%m-%d-%Y` instead of `%m/%d/%Y`! thanks guys
DaNieL