首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP/SQL :排序

问PHP/SQL :排序
EN

Stack Overflow用户
提问于 2011-11-03 10:41:43
回答 3查看 131关注 0票数 0

我有这样的数据的字段(时间):

代码语言:javascript
复制
9:00-11:00 am
7:00-9:00 am
6:30-7:30 pm
1:00-2:30 pm

Select * from表order by time ASC结果:

代码语言:javascript
复制
1:00-2:30 pm
6:30-7:30 pm
7:00-9:00 am
9:00-11:00 am

我无法正确地对其进行排序。任何帮助都行。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-03 10:45:38

将时间存储在两个单独的TIME字段中(例如start_time和end_time ),这两个字段可以按数据库合理地排序。仅仅将时间范围存储为文本并不能告诉数据库任何事情,它不能神奇地理解它的含义。

票数 3
EN

Stack Overflow用户

发布于 2011-11-03 10:46:05

将日期范围存储在MySQL中的两个TIMESTAMP列中,然后可以根据需要对列进行排序。您甚至可以使用MySQL轻松地执行更高级的排序,比如对两个时间戳之间的持续时间进行排序。

票数 0
EN

Stack Overflow用户

发布于 2011-11-03 11:29:04

我不是建议你这样做,而是向你展示为什么你想要像@推荐的那样把它分成多个列。

您可以使用mysql的STR_TO_DATE()将字符串转换为日期。请注意,它完全忽略了时间范围的第一部分,因此它实际上是在排序:

代码语言:javascript
复制
11:00 am
9:00 am
7:30 pm
2:30 pm

查询为:

代码语言:javascript
复制
SELECT 
  time, 
  STR_TO_DATE(time,'%h:%i-%h:%i %p') 
FROM time_table 
ORDER BY STR_TO_DATE(time,'%h:%i-%h:%i %p') ASC

对此进行有效排序的第二个查询:

代码语言:javascript
复制
9:00am
7:00am
6:30pm
1:00pm

是:

代码语言:javascript
复制
SELECT 
  time, 
  STR_TO_DATE(CONCAT(SUBSTRING_INDEX(time,'-',1), SUBSTRING(time,LOCATE(' ', time)+1)), '%h:%i%p') 
FROM time_table
ORDER BY STR_TO_DATE(CONCAT(SUBSTRING_INDEX(time,'-',1), SUBSTRING(time,LOCATE(' ', time)+1)), '%h:%i%p') ASC

(我相信更精通正则表达式的人将能够缩短这段代码)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7989711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档