2010-09-07 669 views
5

我正在处理一个数据库,该日志存储在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子句。

+0

你可以使用'where'而不是'having',但是否则你似乎已经解决了这个问题 - 那么你到底在问什么? – Andomar 2010-09-07 14:03:57

+0

在我发布的最后一个查询中,我不能使用'WHERE'而不是'HAVING',因为执行'WHERE'子句时,表中的字段'mydate'确实不存在。 – Strae 2010-09-07 14:24:27

回答

7

如何使用str_to_date()从您的格式创建日期?

编辑阅读您的评论后,我创建了像你这样的一个表:

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

,然后做

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

似乎工作。你究竟得到了什么?

+0

尝试过,它在逗号(07,09,2010)而不是斜线(07/09/2010)的情况下工作,这是我的情况...我先用''替换'/',然后str_to_date – Strae 2010-09-07 14:26:42

+0

该示例还显示'SELECT STR_TO_DATE('04/31/2004','%m /%d /%Y');'工作。 – 2010-09-07 14:39:24

+0

你好,我曾经写错格式,因为'%m-%d-%Y'而不是'%m /%d /%Y'!多谢你们 – Strae 2010-09-07 15:06:23