我面临按AM / PM排序的问题。
这是我的表数据
login_time
1:30 PM
2:00 AM
8:00 AM
9:30 PM
10:00 PM
11:10 AM
我想要结果为:
login_time
2:00 AM
8:00 AM
11:10 AM
1:30 PM
9:30 PM
10:00 PM
我该怎么做?
答案 0 :(得分:14)
您可以使用STR_TO_DATE功能,如果您愿意,也可以仅使用TIME()提取时间部分:
SELECT
login_time
FROM
tablename
ORDER BY
STR_TO_DATE(login_time, '%l:%i %p')
请参阅小提琴here。
答案 1 :(得分:5)
如果您的日期已经为VARCHAR
,我建议您将其重构为TIME
列。这可以在网上轻松完成:
UPDATE tablename SET login_time = STR_TO_DATE(login_time, '%l:%i %p');
ALTER TABLE tablename CHANGE login_time login_time TIME;
我在这里使用TIME
类型,因为您的数据显然只包含时间。也许DATETIME
类型最合适。有关各种选项,请参阅http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html。
无论如何,一旦将列重构为适当的类型,您可以写:
SELECT
login_time
FROM
tablename
ORDER BY
login_time
借助现在的附加好处,您可以在login_time
上构建索引以加快搜索/排序:
ALTER TABLE tablename ADD INDEX ( login_time );
请参阅http://sqlfiddle.com/#!2/03991/1(点击“查看执行计划”,查看是否已使用实际索引)。
答案 2 :(得分:1)
只需在ORDER BY子句中使用多个表达式,按AM / PM排序,第12小时特殊情况第二,小时第三,以及其他时间的分钟抢占。
ORDER BY
RIGHT(login_time, 2),
CASE
WHEN 12 = convert(int, REPLACE(LEFT(login_time, 2), ':', '')) THEN 1
ELSE 2
END,
convert(int, REPLACE(LEFT(login_time, 2), ':', '')),
login_time
答案 3 :(得分:1)
与提及的评论一样,如果可能 - 更改列的数据类型。如果这超出了您的控制顺序,则转换后的值为:
select login_time from table order by CAST(login_time as datetime)