2011-11-03 45 views
0

我有場(時間)的數據是這樣的:PHP/SQL:排序

9:00-11:00 am 
7:00-9:00 am 
6:30-7:30 pm 
1:00-2:30 pm 

SELECT * FROM表的順序按時間ASC 結果:

1:00-2:30 pm 
6:30-7:30 pm 
7:00-9:00 am 
9:00-11:00 am 

我有點不能是正確的。任何幫助都可以。

感謝

+0

該字段的數據類型是什麼?如果它不是一個日期,那麼它將不會爲你正確排序(至少使用該查詢)。 – hafichuk

回答

3

存儲在兩個不同的領域TIMEstart_timeend_time爲例),可以通過合理的數據庫進行排序您的時間。只是將時間範圍存儲爲文本不會告訴數據庫任何事情,它不能神奇地理解它的含義。

+0

+1:PHP的自然排序可能對字符串有效,但我完全同意。 –

+0

好吧生病吧試試吧 –

0

將您的日期範圍存儲在MySQL的兩個TIMESTAMP列中,然後您可以根據需要對列進行排序。您甚至可以進行更高級的排序,例如使用MySQL輕鬆排序兩個時間戳之間的時間間隔。

0

,建議你這樣做,而是告訴你爲什麼你要拆分此成多列作爲@deceze建議。

您可以使用mysql的STR_TO_DATE()(kindof)將字符串轉換爲日期。需要注意的是它完全忽略了時間範圍的第一部分,所以它的有效排序上:

11:00 am 
9:00 am 
7:30 pm 
2:30 pm 

查詢是:

9:00am 
7:00am 
6:30pm 
1:00pm 

SELECT 
    time, 
    STR_TO_DATE(time,'%h:%i-%h:%i %p') 
FROM time_table 
ORDER BY STR_TO_DATE(time,'%h:%i-%h:%i %p') ASC 

,有效地排序在這個第二查詢

是:

SELECT 
    time, 
    STR_TO_DATE(CONCAT(SUBSTRING_INDEX(time,'-',1), SUBSTRING(time,LOCATE(' ', time)+1)), '%h:%i%p') 
FROM time_table 
ORDER BY STR_TO_DATE(CONCAT(SUBSTRING_INDEX(time,'-',1), SUBSTRING(time,LOCATE(' ', time)+1)), '%h:%i%p') ASC 

(我敢肯定,一個比正則表達更精通的人可以縮短這個)。