2014-01-20 18 views
1

這裏是我的SQL查詢:按日期排序只能用日,月的MySQL

SELECT uid, title, startTime, endTime, cover FROM event ORDER BY startTime DESC 

但是,這會帶給我的元素順序如下:

12/30/2013  00:00 
12/25/2013  00:00 
01/10/2014  00:00 

看起來像它的排序只能用天個月。

你對此有什麼想法嗎?

謝謝。

+11

這就是爲什麼你不應該把你的日期存儲爲字符串 –

+0

Unix時間戳也是一個不錯的選擇。 –

+0

什麼類型的字段? –

回答

6

如果你真的把它們存儲爲字符串,STR_TO_DATE()應該能夠解決這個問題。

SELECT uid, title, startTime, endTime, cover 
FROM event 
ORDER BY STR_TO_DATE(startTime, '%m/%d/%Y') DESC 
+0

這種格式不應該從今年開始嗎?他仍然有可能遇到同樣的問題。 – Flosculus

+1

@Flosculus的格式告訴MySQL輸入格式是什麼,不是輸出格式應該是什麼 – sjagr

+0

謝謝!有用。我不知道這個:) – Copernic

0

所選日期被存儲爲一個字符串或varchar,這意味着標準格式化或DATETIME格式完全拋出窗外。

如果您重新格式化列到DATETIME,你會得到這樣的

2013-12-15 00:00:00 
2013-12-30 00:00:00 
2014-01-10 00:00:00 

你可以看到,最顯著單位是在串順序中的第一行,而最小單位是最後在字符串中,因此允許簡單的排序。

使用@Lars建議有STR_TO_DATE()功能與排序,你應該運行創建新列後,下面的查詢(我們稱之爲newStartTime)結構DATETIME的:

UPDATE event SET newStartTime = STR_TO_DATE(startTime, '%m/%d/%Y %h:%i'); 

然後最終拋出了startTime在您貶低其在您接管的應用程序中的使用情況後。您應該這樣做,因爲字符串到DATETIME的轉換非常耗時,並且在您處理大型結果集時會導致查詢執行時間過長。

+0

謝謝你的回答:) – Copernic

+0

@sjagr我也想提出,但我們不知道如果應用程序的另一部分依賴於原始字符串格式。 –

+0

@LarsBeck它可能是,這就是爲什麼我提到'startTime'必須折舊,而不僅僅是簡單地刪除。我會爲未來的讀者添加一些重點 – sjagr