排序mysql小时AM PM varchar

排序mysql小时AM PM varchar,mysql,sorting,while-loop,Mysql,Sorting,While Loop,排序问题 我有一个带有varchar列的数据库 开始 数据如下(小时) 我喜欢 $query = 'SELECT * FROM `event` WHERE `location_id` = "' . $location['id'] . '" ORDER BY CAST(`start` AS SIGNED) ASC'; 这将提供以下输出 00:15 - 20:15 - 21:30 问题是我终于需要00:15了 20:15 - 21:30 - 00:15 有人吗 CAST( substr(sta

排序问题

我有一个带有varchar列的数据库

开始

数据如下(小时)

我喜欢

$query = 'SELECT * FROM `event` WHERE `location_id` = "' . $location['id'] . '" ORDER BY CAST(`start` AS SIGNED) ASC';
这将提供以下输出

00:15 - 20:15 - 21:30
问题是我终于需要00:15了

20:15 - 21:30 - 00:15
有人吗

CAST( substr(start,1,(length(start-6))) AS SIGNED) 
在我的脑海里-没有测试


基本想法-用子字符串去掉时间部分-然后做你的把戏。

你确定这个要求吗?24小时制的时钟从来没有像那样正常工作过

简单的破解方法是将0小时视为24小时:

SELECT * FROM event
WHERE location_id=?
ORDER BY REPLACE(start, '00:', '24:')
尽管以任何方式这样做都会失去潜在的可转位性。如果需要索引,则必须创建另一列,例如整数分钟加60模1440

[旁白:我强烈建议使用参数化查询,以避免在
location\u id
中潜在的SQL注入]

解决方案是

$query = 'SELECT * FROM event WHERE location_id = "' . $location['id'] . '" ORDER BY IF(LEFT(start,2) = "00",1,0), start ASC';

这看起来像一个解决方案,但是01:15 ect呢?找到了解决方案$query='SELECT*FROM
minicms\u timeline\u event
WHERE
location\u id
='。$location['id']。'ORDER BY IF(左(
start
,2)=“00”,1,0),
start
ASC';您想要什么顺序的
01:15
?问题没有说。
$query = 'SELECT * FROM event WHERE location_id = "' . $location['id'] . '" ORDER BY IF(LEFT(start,2) = "00",1,0), start ASC';