0

所以我在一个表中有一堆“事件”,它们有一个开始列和一个结束列(都是 DATETIME)。我在一天内获取每个事件,并且需要以某种方式将它们组合在一起,以便它们可以显示为单个 HTML 块。

例如...

第 1 行:持续时间为 30 分钟,从 09:00:00 开始,到 09:30:00 结束 第 2 行:持续时间为 30 分钟,从 09:30:00 开始,到 10:00 结束:00 第 3 行:持续时间为 90 分钟,从 12:00:00 开始,到 13:30:00 结束

知道我需要 2 个 html 块的最佳方法是什么......一个是 div 高度为 60px(对于第 1 行和第 2 行),然后因为在 10:00:00 和 12 之间有一个休息: 00:00 拥有另一个高度为 90 像素的 div(第 3 行)。

这可以用 MySQL 以某种方式完成吗?还是我必须做一个 PHP 循环来检查时间的空白空间,以便知道我什么时候应该关闭一个 div 并开始一个新的?

任何帮助都是有益的。

这更像是一个逻辑问题而不是代码问题。

4

2 回答 2

0

您可以在 MySQL 中执行此操作。一种方法是使用相关子查询来确定“事件周期”何时开始。一个新的事件周期在它不与任何其他事件重叠时开始。然后使用此信息为每个事件分配一个“事件期间 ID”。

使用正确的索引,这样的查询会执行得相当好。

您可以在 php.ini 中执行此操作。我倾向于将此类逻辑放入数据库而不是应用程序代码中。

于 2013-08-23T19:19:28.250 回答
0

我个人的偏见是将格式排除在数据库层之外。我会使用 PHP 来做到这一点。

基于您的问题文本的假设:

  1. 持续时间存储在数据库中

  2. 持续时间增量 = 30 分钟

  3. 事件不重叠。

  4. 已使用 ODBC 查询持续时间数据

  5. 持续时间查询包括 ORDER BY Start_Time

  6. 加载到适当的 $result 变量中的持续时间数据

  7. 事件块是每个事件 30 像素。

    $job_count = 0;
    
    $event_increment = 30;
    $event_height = 30;
    
    $this_block_height = 0;
    $this_block_content = "";
    
    
    while(odbc_fetch_row($result)) {
        //fetch all your results into arrays
        $duration[] = odbc_result($result, 1);
        $start_time[] = odbc_result($result, 2);
        $end_time[] = odbc_result($result,3);
        $event_count++;
    }
    
    for($x=0;$x < $event_count; $x++) {
        //loop through the arrays to format the blocks
        if($x + 1 == $job_count) {
            //if this is true, we are at the last element
            $this_block_height += $event_height; 
            $this_block_content .= $start_time[$x] . " to " . $end_time[$x] . PHP_EOL;
            echo "<DIV style='height:" . $this_block_height . "px;'>$this_block_content</DIV>";
        }
        else {
            if($end_time[$x] == $start_time[$x+1]) { 
                //if this is true there is no gap.
                $this_block_height += $event_height; 
                $this_block_content .= $start_time[$x] . " to " . $end_time[$x] . PHP_EOL;
            }
            else {
                 //gap identified
                 //write old block to file with padding on the end
                 //reset values to start over
                 $end_seconds = strtotime($end_time[$x]);
                 $start_seconds = strtotime($start_time[$x+1]);
                 $gap = $start_seconds - $end_seconds;
                 $gap_minutes = $gap / 3600;
                 $gap_increments = $gap_minutes / $event_increment;
                 $this_block_height += ($event_height * $gap_increments);
                 echo "<DIV style='height:" . $this_block_height . "px;'>$this_block_content</DIV>";
                 //this will put the space padding at the end of the first block
                 //instead of at the start of the second block  
                 $this_block_height = 0;
                 $this_block_content = "";
            }       
        }
    }
    
于 2013-08-23T20:19:02.873 回答