2010-03-15 104 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()進行比較。