【问题标题】:Sort tinytext time from mysql db query with sql or sort the array it produces using PHP使用 sql 对 mysql db 查询中的 tinytext 时间进行排序,或使用 PHP 对其生成的数组进行排序
【发布时间】:2009-08-21 19:36:01
【问题描述】:

大家好 - 问题源于用于存储房地产信息的数据库设计不当。我为我的客户设置了一个模板来选择一个周末并显示那个周末的开放日。开放时间(ohtime1、ohtime2、ohtime3)存储为 tinytext,无法知道 AM 或 PM。 “12:00 - 2:00”和“01:00 - 03:00”是我们人类识别为中午-2pm和1pm-3pm的常见条目,但是当我查询数据库并按ohtime1排序时,它显然是01 12:00 之前:00。我在使用 SQL 和使用不同的 php 排序方法进行排序时遇到了困难。包含所有开放日信息的初始列表数组设置如下:

$listings[0][displayaddress] = 帝国大厦
$listings[0][baths] = 数不胜数
$listings[0][ohtime1] = 12:00 - 02:00

$listings[1][displayaddress] = 麦迪逊广场花园
$listings[1][浴池] = 2
$listings[1][ohtime1] = 01:00 - 03:00
等等……

我用 foreach($listings as $listing) 遍历 $listings 以处理我们使用的 smarty 模板,以及分成不同的日子,然后再次处理曼哈顿和布鲁克林列表。这会产生 4 个新数组。我的理论是,如果我将上午 09:00 之前的所有时间转换为 24 小时时间,然后对它们进行排序,然后分配到不同的日期/行政区,它将起作用。这是转换代码:

$p = explode("-",$listing[ohtime1]);  //01:00 - 03:00
    $time1 = trim($p[0]); //01:00
    $time2 = trim($p[1]); //03:00
    $hour1 = substr($time1,0,2);  //01
    $hour2 = substr($time2,0,2);  //03
    $min1 = explode(":",$time1);  
    $min2 = explode(":",$time2);
    $min1 = $min1[1]; //00
    $min2 = $min2[1]; //00

    //convert all times to 24 hour
    if($hour1 < 9) $hour1 = $hour1+12; //13
    if($hour2 < 9) $hour2 = $hour2+12; //15
    $listing[ohtime1] = $hour1.":".$min1." - ".$hour2.":".$min2; //13:00 - 15:00
    $listing[hour1] = $hour1;
    $listing[hour2] = $hour2;

转换并不困难,但不知道如何对它们进行排序。我不精通高级 SQL 理论,无法将我在 php 中所做的 24hrs 转换为 mysql。我还想在创建新数组时实现排序功能,但我又不知所措了。下面是分离成新数组的代码:

foreach($openhouse_date_fields as $oh){ //3 possible open house dates  
if(substr($listing[$oh], 0,10) == $date) {  //if any of the listings's open houses match the first search date  
    if($listing[sect] == "Brooklyn") {  
       $listingsb[$listing[displayaddress]] = $listing;  
    }  
    else  
       $listingsm[$listing[displayaddress]] = $listing;  
}  
elseif(substr($listing[$oh], 0,10) == $date2) { //if any of the listings's open houses match the second search date  
      if($listing[sect] == "Brooklyn")  
      $listingsb2[$listing[displayaddress]] = $listing;  
      else  
       $listingsm2[$listing[displayaddress]] = $listing;  
}  
}  

我希望这是足够的信息。感谢您抽出宝贵时间阅读并提供任何反馈!

【问题讨论】:

    标签: php mysql time sorting associative-array


    【解决方案1】:

    以下是将TINYTEXT 列之一转换为TIME 类型的一对列的示例:

    SELECT
     MAKETIME(start_hour  + IF(start_hour<9, 12, 0), start_minute, 0) AS start_time,
     MAKETIME(finish_hour + IF(start_hour<9, 12, 0), finish_minute, 0) AS finish_time
    FROM (
     SELECT
      SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ',  1), ':',  1) AS start_hour,
      SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ',  1), ':', -1) AS start_minute,
      SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ', -1), ':',  1) AS finish_hour,
      SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ', -1), ':', -1) AS finish_minute
     FROM MyOpenHouseTable) t
    ORDER BY start_time;
    

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2017-08-20
      相关资源
      最近更新 更多