如何在SQL中对时间(在AM / PM中)进行排序?

时间:2013-08-07 17:34:06

标签: mysql sql

我面临按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

我该怎么做?

4 个答案:

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