我正在处理一个数据库,该日志存储在varchar(10)
mysql字段中(很伤心)。Mysql:将日期转换为'dd/mm/yyyy'为'yyyymmdd'
我不能改变数据库结构(即时建立一个小插件),但我不得不查询数据库查找数据字段在未来10天之间的行。
实施例:
| fid | fdate |
| 1 | 10/09/2010 |
| 2 | 17/09/2010 |
| 3 | 19/09/2010 |
我要得到具有FID 1和2的行中,becose日期是< =现在+ 10天。
通常我做这样的查询:
SELECT fid FROM table WHERE fdate <= DATE_ADD(NOW(), INTERVAL 10 DAY);
或者,如果日期的格式为`YYYYMMDD':
SELECT fid FROM table WHERE fdate <= DATE_FORMAT(NOW(), '%Y%m%d');
但是没用吗更有用的格式dd/mm/yyyy
。
我已经想通了与
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);
,但我想这是一个有点矫枉过正重建与CONCAT和字符串的日期格式,以及having
条款不会帮助查询速度。
有什么想法?
编辑
阿德里亚诺的评论后,正确的解决方案是
SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY);
这样我就可以避开CONCAT和having子句。
你可以使用'where'而不是'having',但是否则你似乎已经解决了这个问题 - 那么你到底在问什么? – Andomar 2010-09-07 14:03:57
在我发布的最后一个查询中,我不能使用'WHERE'而不是'HAVING',因为执行'WHERE'子句时,表中的字段'mydate'确实不存在。 – Strae 2010-09-07 14:24:27