2013-11-26 54 views
-1

這裏是我的查詢:我需要一個查詢來刪除一行,如果日期是過期

DELETE FROM `upcoming` WHERE `Date` < DATE_FORMAT(CURDATE(), '%M-%d-%y') 

當我運行它,它會刪除我的表中的每一件事。 日期是我放置即將到來的事件日期的列。 這是我在我的桌子上。 它應該只刪除一個日期不是他們兩個。

表:

12-25-13 
11-11-13 

今天的日期:

11-25-13 
+0

是不是'date'是mysql中的保留字? – Babblo

+2

如果您的日期格式爲mm-dd-yy,那麼爲什麼您的查詢使用mm/dd/yy? – 2013-11-26 01:16:30

+0

這可能會有所幫助:[刪除所有行比5天更早](http://stackoverflow.com/questions/5853543/deleting-all-rows-older-than-5-days) – showdev

回答

0

嘗試

DELETE FROM `upcoming` WHERE STR_TO_DATE(`Date`, '%M-%d-%y') < DATE_FORMAT(CURDATE(), '%M-%d-%y') 
0

的規範模式是使用DATE數據類型來存儲數據。

它看起來像是將「日期」值存儲爲VARCHAR,格式爲「mm-dd-yy」。 VARCHAR表達式的比較按字符從左到右進行。具有月份的字符表示不是按正則順序排列的,也就是說,某種mm-dd-yy值不會按日期順序排序,例如, '01 -01-13'(2013年1月)將在'11-27-12'之前排序(2012年11月)。

根據SQL語句,最簡單的方法是將VARCHAR轉換爲DATE數據類型,並將其與一個也返回DATE的表達式進行比較。

DELETE FROM `upcoming` WHERE STR_TO_DATE(`Date`,'%m-%d-%y') < CURDATE() 

就性能而言,MySQL無法執行索引範圍掃描來滿足此謂詞。需要檢查表中的每一行,進行轉換,然後進行比較。如果列存儲爲DATE,那麼可以在謂詞中引用裸列,並且MySQL可以使用索引範圍掃描。


ALSO:'%M'格式說明返回月份的名字, '一月', '二月',等等。'%m'符返回月份數字 '01', '02'。

相關問題