0

そのため、開始列と終了列 (両方とも DATETIME) を持つテーブルに一連の「イベント」があります。私は 1 日のすべてのイベントをフェッチしており、1 つの 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 ブロッ​​クが必要であることを知る最善の方法は何でしょうか... 1 つは 60 ピクセルの高さ (行 1 と 2) の div であり、10:00:00 と 12 の間に休憩があるためです: 00:00 90px の高さ (行 3) の別の div を設定します。

これはどういうわけかMySQLで行うことができますか? それとも、いつdivを閉じて新しいものを開始する必要があるかを知るために、空のスペースをチェックするためにPHPループを実行する必要がありますか?

どんな助けでも有益です。

これは、コードの質問というよりは論理的な質問です。

4

2 に答える 2

0

これは MySQL で実行できます。1 つの方法は、相関サブクエリを使用して、「イベント期間」がいつ始まるかを判断することです。他のイベント期間と重複しない新しいイベント期間が始まります。次に、この情報を使用して、各イベントに「イベント期間 ID」を割り当てます。

このようなクエリは、適切なインデックスを使用するとかなりうまく機能します。

phpでこれを行うことができます。私は、そのようなロジックをアプリケーション コードではなくデータベースに入れることに偏っています。

于 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 に答える