2013-08-07 54 views
4

我面临的问题,根据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 

我怎样才能做到这一点?

+3

在你的数据库中的那些字符串? – Mat

+0

是,数据类型为varchar(1024) –

+0

在哪里查询?如果没有查询将数据从数据库中排序出来,就不能通过login_time命令来排序数据。 – ps2goat

回答

13

你可以使用STR_TO_DATE功能,如果你愿意,你也可以只提取与TIME()部分时间:

SELECT 
    login_time 
FROM 
    tablename 
ORDER BY 
    STR_TO_DATE(login_time, '%l:%i %p') 

请参阅小提琴here

+0

感谢它正在工作 –

+0

这是行得通的,但效率非常低,因为你无法建立函数索引。 –

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 
+0

确定这可行吗?你测试过了吗?这绝对不是AM/PM格式是排序友好的,除非你真的*使它*排序(用比你更混乱的字符串表达式)。我的意思是,如果你有上午11点,下午12点和晚上11点,你的建议不会按照他们应该排序的方式排序。 –

+0

这里是我的查询与您的订单 SELECT * FROM tbl_data ORDER BY RIGHT(login_time,2),转换(INT,REPLACE(LEFT(login_time,2), ':', '')),login_time LIMIT 0 ,30 –

+0

@AndriyM在第一个表达式之后,上午11点将是第一个,下午12点和下午11点将并列第二个。在第二个表达之后,领带将被打破 - 下午11点将是第二个,下午12点将是第三个。但由于12小时制的性质,下午12点应该是最快的,所以我会纠正。 –

1

像提到的评论,如果可能的话 - 更改列的数据类型。如果这是你的控制命令通过转换值:

select login_time from table order by CAST(login_time as datetime) 
+1

很好很简单的答案...谢谢你! ~~~~'''$$$''''~~~ – Vikrant

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(点击“查看执行计划”,看看实际指数已使用)。

相关问题