2017-10-28 60 views
0

我有一個MySQL表作爲 表:訂單mysql的可選擇按日期和時間STR_TO_DATE

Order | day     | time 
1  | Tuesday 31-10-2017 | 10:00 AM 
2  | Thursday 02-11-2017 | 11:00 AM 
3  | Tuesday 31-10-2017 | 01:00 PM 
4  | Tuesday 31-10-2017 | 10:00 AM 
5  | Sunday 29-10-2017 | 09:30 AM 

我需要根據日期和時間順序進行排序,例如:

Order | day     | time 
5  | Sunday 29-10-2017 | 09:30 AM 
1  | Tuesday 31-10-2017 | 10:00 AM 
4  | Tuesday 31-10-2017 | 10:30 AM 
3  | Tuesday 31-10-2017 | 01:00 PM 
2  | Thursday 02-11-2017 | 11:00 AM 

嘗試:

select * from request ORDER BY STR_TO_DATE(time,'%h:%i%p') asc, STR_TO_DATE(day,'%l %d-%m-%Y') desc 

但那不是排序預期...

+0

爲什麼使用這種數據類型,而時間戳可以做到這一點沒有任何自定義查詢? – Akam

+0

時區非洲/開羅 –

回答

2

真的,你應該使用內部日期格式存儲日期,而不是字符串。您可以使用日期/時間函數輕鬆獲取一週中的日期。

您的日期格式使得這個就更難了,但你可以這樣做:

order by str_to_date(substring_index(day, ' ', -1), '%d-%m-%Y'), 
     str_to_date(time,'%h:%i%p') 

現在你已經解決了這個問題,回到你的數據,並做到:

alter table orders add column orderdate datetime; 

update orders 
    set orderdate = addtime(str_to_date(substring_index(day, ' ', -1), '%d-%m-%Y'), 
          str_to_date(time,'%h:%i%p')); 

檢查orderdate是正確的。然後做:

alter table orders drop column day; 
alter table orders drop column time; 

這不是很好嗎?您的數據現在已修復。

0

下面的查詢將工作:

select * from request 
ORDER BY STR_TO_DATE(SUBSTRING_INDEX(day,' ',-1),'%d-%m-%Y'), 
     STR_TO_DATE(time,'%h:%i%p') desc, 
+0

它工作正常嗎? –

0

首先,你應該先訂購更重要的列。所以訂單聲明的順序應該是;

ORDER BY STR_TO_DATE(day,'%l %d-%m-%Y') desc, STR_TO_DATE(time,'%h:%i%p') asc 

而日欄應該是asc而不是desc;

ORDER BY STR_TO_DATE(day,'%l %d-%m-%Y') asc, STR_TO_DATE(time,'%h:%i%p') asc 

順便說一句,我認爲星期的the pattern%W而不是%l;

ORDER BY STR_TO_DATE(day,'%W %d-%m-%Y') asc, STR_TO_DATE(time,'%h:%i%p') asc 

我在這裏試過; http://sqlfiddle.com/#!9/f8fdbf/11/0