我面临的问题,根据AM/PM排序。如何在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
我怎样才能做到这一点?
我面临的问题,根据AM/PM排序。如何在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
我怎样才能做到这一点?
你可以使用STR_TO_DATE功能,如果你愿意,你也可以只提取与TIME()部分时间:
SELECT
login_time
FROM
tablename
ORDER BY
STR_TO_DATE(login_time, '%l:%i %p')
请参阅小提琴here。
感谢它正在工作 –
这是行得通的,但效率非常低,因为你无法建立函数索引。 –
只要使用多个表达式在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
确定这可行吗?你测试过了吗?这绝对不是AM/PM格式是排序友好的,除非你真的*使它*排序(用比你更混乱的字符串表达式)。我的意思是,如果你有上午11点,下午12点和晚上11点,你的建议不会按照他们应该排序的方式排序。 –
这里是我的查询与您的订单 SELECT * FROM tbl_data ORDER BY RIGHT(login_time,2),转换(INT,REPLACE(LEFT(login_time,2), ':', '')),login_time LIMIT 0 ,30 –
@AndriyM在第一个表达式之后,上午11点将是第一个,下午12点和下午11点将并列第二个。在第二个表达之后,领带将被打破 - 下午11点将是第二个,下午12点将是第三个。但由于12小时制的性质,下午12点应该是最快的,所以我会纠正。 –
像提到的评论,如果可能的话 - 更改列的数据类型。如果这是你的控制命令通过转换值:
select login_time from table order by CAST(login_time as datetime)
很好很简单的答案...谢谢你! ~~~~'''$$$''''~~~ – Vikrant
如果你已经有你的日期为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(点击“查看执行计划”,看看实际指数已使用)。
在你的数据库中的那些字符串? – Mat
是,数据类型为varchar(1024) –
在哪里查询?如果没有查询将数据从数据库中排序出来,就不能通过login_time命令来排序数据。 – ps2goat