2014-09-27 34 views
0

我需要按日期排序表(降序),但表中的所有列都是varchar,所以我需要操縱數據以便正確排序。當列聲明時按日期排序mysql表varchar

date  sales 
10/09/2014 100 
13/09/2014 250 
30/08/2014 200 

是否有可能不改變表格?所以結果如下,最新的日期在先?

date  sales 
13/09/2014 250 
10/09/2014 100 
30/08/2014 200 

像僞

SELECT * FROM table ORDER BY (CONCAT(REGEXP(date, '[0-9]{4}'), 
REGEXP(date, '/[0-9]{2}/'), REGEXP(date, '^[0-9]{4}/')) DESC 

我想我需要使用substring_index莫名其妙,因爲regexp剛剛返回1或0,沒有找到實際的價值。

+3

MySQL有一個數量的日期和時間功能,可以幫助這一點,但真正的解決辦法是重新設計你的表,這樣的列有相應的數據類型。即使你通過這個問題,糟糕的設計也會再次咬你。 – 2014-09-27 01:18:07

+0

如果此列存儲爲'DATE'而不是'VARCHAR',那麼M​​ySQL將能夠使用**索引**進行ORDER BY操作,按順序返回行,而不需要使用「使用filesort」對來自表達式的值進行操作。同樣的原則適用於範圍謂詞,獲取所有行的一個月......在DATE列中,我們可以編寫一個查詢來啓用索引範圍掃描操作,使用VARCHAR這樣的列,它將需要一個表達式來評估表中的每一個翻轉行。 – spencer7593 2014-09-27 02:03:20

回答

3

您需要將您的varchar存儲的日期對象轉換爲DATE對象,然後使用它們進行排序。

這個你可以在飛行中做像這樣

ORDER BY STR_TO_DATE(date,'%d/%m/%Y') DESC 

但性能將是可怕的。爲獲得最佳效果,請將表格中的日期存儲在DATE列中。

2

可以使用STR_TO_DATE

SELECT * 
FROM Table1 
ORDER BY STR_TO_DATE(date, '%d/%m/%Y') desc, 
sales desc