我在MySQL中有一个总线表,每个总线都有一些到达时间。我需要在第一次到达时对公交车进行分类。
+-------+-------------------------------+
| bus | time |
+-------+-------------------------------+
| Bus A | 8 a.m.<br/>9 a.m. |
| Bus B | 12 p.m.<br/>1 p.m.<br/>2 p.m. |
| Bus C | 10 a.m. |
| Bus D | 9:30 a.m. |
+-------+-------------------------------+
+-------+-------------------------------+
| bus | time |
+-------+-------------------------------+
| Bus C | 10 a.m. |
| Bus B | 12 p.m.<br/>1 p.m.<br/>2 p.m. |
| Bus A | 8 a.m.<br/>9 a.m. |
| Bus D | 9:30 a.m. |
+-------+-------------------------------+
+-------+-------------------------------+
| bus | time |
+-------+-------------------------------+
| Bus A | 8 a.m.<br/>9 a.m. |
| Bus D | 9:30 a.m. |
| Bus C | 10 a.m. |
| Bus B | 12 p.m.<br/>1 p.m.<br/>2 p.m. |
+-------+-------------------------------+
我尝试过使用this answer,但似乎没有用。这可能是由于格式化问题 - “凌晨2点”与“凌晨2点”。
SELECT bus_timing
FROM buses
ORDER BY STR_TO_DATE(bus_timing, '%l:%i %p')
那么,如何根据时间对这些数据进行排序而不改变数据?
答案 0 :(得分:1)
STR_TO_DATE
格式和方法看起来不错。所以数据可能就是问题。
此
ORDER BY STR_TO_DATE(REPLACE(UCASE(bus_timing),'.',''), '%l:%i %p')
将移除a.m.
和p.m.
中的点并将其更改为大写,这将更符合预期的%p
格式
答案 1 :(得分:1)
如果您可以按照上午8点而不是上午8点的方式格式化日期,则可以使用
select STR_TO_DATE( substr('8 30 am<br/>9 a.m. ', 1,
LOCATE('<br/>','8 30 am<br/>9 a.m. ') -1), '%l%i %p');
您应该只获取第一个值的时间并为此
排序答案 2 :(得分:1)
使用substring_index()
将字符串分开并获取第一个元素。然后按第一个元素排序。
所以:
order by str_to_date(substring_index(time, '<', 1), '%l:%i %p')