2010-03-15 388 views
0

嗨,大家好,我只是试图从我的数据库中提取所有记录,其中rec_date(varchar)存储为m/d/Y并且已过期(如小于curdate() ),这个电话并没有给我我想要的东西:MySQL DATE_FORMAT与CURDATE()查询的比较

SELECT member_id, 
     status, 
     DATE_FORMAT(STR_TO_DATE(rec_date, '%m/%d/%Y'), '%Y-%m-%d') AS rec 
    FROM members 
WHERE rec_date > CURDATE() 
    AND status = '1' 

我明显做错了事,你能帮忙吗?

回答

0

我同意zerkms应尽可能使用适当的数据类型。否则,您必须使用子查询字符串/ VARCHAR转换成日期/时间数据类型第一:

SELECT x.member_id, 
     x.status, 
     DATE_FORMAT(x.rec_dt, '%Y-%m-%d') 
    FROM (SELECT m.member_id, 
       m.status, 
       STR_TO_DATE(m.rec_date, '%m/%d/%Y') AS rec_dt 
      FROM MEMBERS m 
     WHERE m.status = '1') x 
WHERE x.rec_dt < CURDATE() 
+0

是的,这会做...我知道我非常想保存这下“日期“类型,但我不能控制这个不幸的事情,并且必须与我所给予的一致。我知道,糟糕,但嘿。 再次感谢。 – 2010-03-15 04:30:05

+0

你为什么需要在子查询中?可怕的解决方案。为什么不按照我的建议在WHERE中使用STR_TO_DATE(m.rec_date,'%m /%d /%Y')? – zerkms 2010-03-15 05:17:20

+0

这个子查询将比全查询的查询要糟糕得多。因为一旦子查询结果在内存中创建并且不适合 - 它将成为光盘上的临时表,写入并在之后进行查找,以用于外部查询。你可以用EXPLAIN来检查它;-) 实际上,你将得到相同的查询计划,但有一个步骤,这也将是fullscan。 – zerkms 2010-03-15 05:52:30

0

正确的方法是将数据存储在适当的字段类型中。使用“日期”类型而不是“varchar”。

无论如何 - 您可以使用DATE_FORMAT格式化rec_date以在WHERE子句中将字符串正确并将其与CURDATE()进行比较。