2011-12-16 61 views
0

我已經有幾個月存儲在像這樣的表格中,「十二月,八月,七月」等。我如何排序我的查詢,以便按時間順序而不是按字母順序排列?我可能需要從字符串轉換爲時間來獲得一個數字,然後順序,我可以在PHP中做到這一點,但不知道如何直接在查詢中做到這一點,所以我不必做一個查詢,使用PHP操縱一些數據,然後使用它進行另一個查詢。MySQL月份作爲字符串存儲,如何按照時間順序而不是按字母順序排列?

MySQL可以在查詢中執行此操作嗎?

謝謝。

回答

1

是的,你會討厭這樣的: -

order by 
case month_column 
    when "January" then 1 
    when "February" then 2 
    ... 
    when "December" then 12 
end case 

有mysql中

 
mysql> select str_to_date('January', '%M'); 
+------------------------------+ 
| str_to_date('January', '%M') | 
+------------------------------+ 
| 0000-01-00     | 
+------------------------------+ 

--> sorting 
order by str_to_date(column_name, '%M') 

既然你不打算提供其他信息(年,日,時間的另一個str_to_date功能),
所以這個功能也會起作用。

最好的辦法是所有的字符串轉換成小整數,
這是正確的做法,並有最好的優化

+0

你說得對,我討厭那種基於案例的解決方案。但無論如何,這根本不是一個理想計劃的數據庫。我用str_to_date解決方案完成了你的訂單。謝謝。 – 2011-12-16 19:44:05

3

我會做的是創建另一個表

CREATE TABLE MONTH_NAME 
( 
    MONTH_NAME VARCHAR, // or whatever type the month is in your db 
    MONTH_NUMBER INT 
) 

裝滿「月」,1等

然後在查詢連接兩個表在這裏月份名稱和順序由MONTH_NUMBER 。

0

如果你有一個months表,那麼你可以訂購month_number

select field from tablename join months using (month_name) 
    order by month_number asc; 

例如

insert into months (month_name, month_number) 
    values ('January', 1), ('February', 2), ... 
0

我會在表中添加一個db類型的整數。然後,我會創建另一個參考表與monthes Col1名稱:一月Col2值:1:Col1名稱:二月Col2值:2 ..等 然後,我會內部加入名稱,並按值排序。工程100%

1

您可以使用CASE statement

SELECT 
CASE 
    WHEN `month` = 'January' THEN 1 
    WHEN `month` = 'February' THEN 2 
    WHEN `month` = 'March' THEN 3 
    WHEN `month` = 'April' THEN 4 
    WHEN `month` = 'May' THEN 5 
    .... 
END AS orderbymonth 
FROM yourtable 
ORDER BY orderbymonth ASC 
0

試試這個:

SELECT * FROM tablename ORDER BY FIELD(month_column, 
'December', 'November', 'October', 
'September', 'August', 'July', 
'June', 'May', 'April', 
'March', 'February', 'January') DESC, month_column ASC 

希望這會有所幫助。