使用多行

时间:2016-11-07 10:48:13

标签: php mysql sql sorting

简介

我在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')

问题

那么,如何根据时间对这些数据进行排序而不改变数据?

3 个答案:

答案 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')