MySQL按时间顺序存储为HH:MM:SS

时间:2015-06-18 09:30:52

标签: php mysql

我有一个varchar类型的字段,用于存储格式为HH:MM:SS的字符串,即 01:25:59 (有时没有 HH 部分例如 25:59 )。

我想根据这个时间有一个降序的结果,因为我带有[str_to_date()][1]函数,目前我正在使用str_to_date($field_value,'%l:%i:%s') DESC来实现这种排序。

奇怪的是,使用此格式%l:%i:%s所有以MM:SS格式显示此字段的帖子都会正确排序,但HH:MM:SS中的字段不是。

1 - 如果我有这些值:

11:35
15:20
48:00
01:57:47
01:20:26

2 - 它们分类为:

48:00
01:20:26
15:20
11:35
01:57:47

3 - 哪个错了,应该是:

01:57:47
01:20:26
48:00
15:20
11:35

如您所见( 2 ),HH:MM:SS格式的唯一时间未正确放置( DESC

我怎样才能进行正确的排序?

3 个答案:

答案 0 :(得分:2)

这个怎么样?

SELECT  * FROM tbl 
ORDER BY TIME_TO_SEC(IF(LENGTH(str_time)<6,CONCAT("00:",str_time),str_time)) DESC

小提示演示:http://sqlfiddle.com/#!9/4b5da/3

答案 1 :(得分:1)

这是您的查询:

$rate=$data['slider1'];

$key =array_keys($data['sub']); 
//print_r($key);
$pricing2 = $data['slider1'];
$pricing = $pricing2 * 1.15;
$postcode = $data['postcode'];


$bindings = array();
$bindings[] = array(":pricing", $pricing, PDO::PARAM_STR);
$bindings[] = array(":distance", $postcode, PDO::PARAM_STR);

$key_placeholders = array();
foreach($key as $k => $v) {
    $placeholder = ":subid".$k;
    $bindings[] = array($placeholder, $v, PDO::PARAM_INT);
    $key_placeholders[] = $placeholder;
}
$sql = "SELECT Name,PostUUID,pricing,Poscode , ABS( Poscode - :distance ) AS distance,subname,Reputation,ReviewPlus,ReviewNeg,week_morning,week_afternoon,week_evening,weekend_morning,week_afternoon,week_evening,weekend_morning,weekend_afternoon,week_evening,weekend_morning,weekend_afternoon,weekend_evening,date,Phone,Sex,UUID,catname FROM posts,subjects,categories "
        . "WHERE posts.subid IN (". implode(",",$key_placeholders).") "
        . "AND posts.pricing <=:pricing "
        . "AND posts.Poscode =:distance "
        . "AND posts.subid=subjects.subid "
        . "AND subjects.catid=categories.catid "
        . "ORDER BY distance "
        . "DESC LIMIT 100";

$statement = $pdo->prepare($sql);
foreach($bindings as $b) {
    $statement->bindValue($b[0],$b[1],$b[2]);
}
$statement->execute();

SQL小提琴:http://sqlfiddle.com/#!9/b6a52/1

答案 2 :(得分:0)

想在应用方面做些什么?有点长,但它的工作原理。

            $tim_arr = array ('11:35', '15:20', '48:00', '01:57:47', '01:20:26');

            $new_arr = array();
            foreach ($tim_arr AS $tim){
            $tim_chk = $key = '' ; $ntim_arr =array();
            $tim_chk =  substr_count($tim, ":");
            $ntim_arr = explode(':',$tim);
                    if($tim_chk == 2){
                            $ntim = ( (int)$ntim_arr[0]*60 + (int)$ntim_arr[1] ).':'.$ntim_arr[2];
                            $key = ( (int)$ntim_arr[0]*60 + (int)$ntim_arr[1] );
                    }
                    else{
                            $ntim = $tim;
                            $key  = $ntim_arr[0];
                    }
                    $new_arr[$key] = $ntim ;
            }
            krsort($new_arr);
            foreach ($new_arr AS $tim)
            {
                    $ntim_arr = explode(':',$tim);
                    if((int)$ntim_arr[0] >= 60){
                            echo str_pad(floor($ntim_arr[0] /60),2,"0",STR_PAD_LEFT).":".
                                 str_pad($ntim_arr[0] %60,2,"0",STR_PAD_LEFT).":".$ntim_arr[1]."<br/>";       
                    }
                    else{
                            echo $tim."<br/>";
                    }
            }