3

最初に、私が最終的に達成しようとしていることのフィドルがあります: フィドル

そのためには、3 つの異なるテーブル (ok_part、reject、stoppage) から値を取得する必要があります。

停止に関しては、テーブル構造は次のようになります。

停止表の構造

私のグラフの x 軸は 1 時間のギャップです。最初の x 軸は常に 8 時間前の時間で、最後の 1 時間は今から次の 1 時間までです。

ハイチャートのok_partとreject配列をまとめることができました。

class GraphCalc() {
  .....
  /* calculate time */
  function CalculateTime($diff, $form) {

    $new = new DateTime();
    $new->modify($diff);
    return $form != 0 ? $new->format('Y-m-d H:00') : $new->format('Y-m-d');
  }

  function GraphInterval() {

    $time = strtotime($this->CalculateTime('-8 hours', 1)); // calling function to get time 8 hours ago
    $now = strtotime(date('Y-m-d H:00'));

    /* looping through time (8 hours ago to now) */
    for ($i = $time, $j = $i + 3600; $i <= $now; $i += 3600, $j += 3600) {

        /* puts together array for x Axis */
        $this->xAxis_array[] =  "'".date('H:00', $i).' - '.date('H:00', $j)."'";

        /* queries to sum ok parts and rejects according to time */
        $ok_part_sum[] = MouldingPart::find(
            array(
                'select' => 'SUM(amount) as ok_qty', 
                'conditions' => array(
                    'moulding_product_id IN (?) AND date >= ? AND date <= ?', 
                    $this->product_id, 
                    date('Y-m-d H:00', $i), 
                    date('Y-m-d H:00', $j)
                )
            )
        )->ok_qty;
        $reject_part_sum[] = MouldingReject::find(
            array(
                'select' => 'SUM(amount) as reject_qty', 
                'conditions' => array(
                    'moulding_product_id IN (?) AND date >= ? AND date <= ?', 
                    $this->product_id, 
                    date('Y-m-d H:00', $i), 
                    date('Y-m-d H:00', $j)
                )
            )
        )->reject_qty;
    }

    /* looping through ok_part and reject arrays to add 0 where there's no value */
    for ($i = 0; $i < count($ok_part_sum); $i++) { 
        $this->chart_ok_array[] = $ok_part_sum[$i] == '' ? 0 : $ok_part_sum[$i];
        $this->chart_reject_array[] = $reject_part_sum[$i] == '' ? 0 : $reject_part_sum[$i];
    }
  }

  function xAxis() {
    /* return x Axis values */
    return implode(', ',$this->xAxis_array);
  }

  function yAxisValues() {
    /* put together arrays for highchart */
    $chart_data[] = "{data: [".implode(", ",$this->chart_ok_array)."], name: 'OK', color: '#89A54E'}";
    $chart_data[] = "{data: [".implode(", ",$this->chart_reject_array)."], name: 'PRAAGID', color: '#AA4643'}";


    return $chart_data;
  }
}

停止データの解決方法を教えてください。停止には、start_date と end_date の 2 つの日付を考慮する必要があります。x 軸と停止日に基づいて、期間を計算する必要があります。おそらく期間フィールドを使用できる場合もありますが、それを避けてその場で計算する方が簡単だと思います。

停止で達成したいことの例を次に示します。

x 軸が 05:00 ~ 06:00 の場合、停止時間は 59 分である必要があります。これは、停止テーブルに start_date 2013-09-05 05:01:00 および end_date 2013-09-05 09:00 のエントリがあるためです。 :00、しかし、06:00 である x 軸の値を使用する必要があるため、停止テーブルの値の終了日を使用できません。

私が達成しようとしていることを理解していただければ幸いです。説明するのは本当に難しいです。

停止表のデータも異なる場合があります。1 時間に複数回の停止が発生する可能性があります。x 軸が 08:00 - 09:00 で、表に 3 つの停止があるとします。

start_date: 07:54 end_date: 08:15 start_date
: 08:19 end_date: 08:38 start_date
: 08:45 end_date: 09:47
したがって、08:00 から 09:00 までの期間は 49 分になります。

これで私を助けてください、私はこれで何日も立ち往生しています.. できる限りうまく説明しようとしましたが、まだ混乱していると思います.

最後に、ok_part と reject の場合のように、highchart の配列を取得したいと思います。

4

1 に答える 1

1

アイデアは、TIMESTAMPDIFFを で減算するend_dateを使用することですstart_date:

$stoppage_part_sum[] = MouldingStoppage::find(
    array(
        'select' => 'SUM(
            ABS(TIMESTAMPDIFF(
                MINUTE,
                IF(end_date > \''.date('Y-m-d H:00', $j).'\', \''.date('Y-m-d H:00', $j).'\', end_date),
                IF(start_date < \''.date('Y-m-d H:00', $i).'\', \''.date('Y-m-d H:00', $i).'\', start_date)
            ))
        ) as stoppage_qty', 
        'conditions' => array(
            'moulding_product_id IN (?) AND end_date >= ? AND start_date <= ?', 
            $this->product_id, 
            date('Y-m-d H:00', $i), 
            date('Y-m-d H:00', $j)
        )
    )
)->stoppage_qty;

IF(end_date > ...)andは、現在のIF(start_date < ...)ウィンドウに時間のみを取り込みます。次に、これを使用します:

start_date: 08:00 end_date: 08:15
start_date: 08:19 end_date: 08:38
start_date: 08:45 end_date: 09:00

次に、あなたと彼らだけTIMESTAMPDIFF end_dateです。 start_dateSUM

関連する「停止」に一致する条件に注意してください。( start_date< jおよびend_date> i )

デモ sqlFiddle

データの日付を変更して結果を確認してください。

于 2013-09-05T08:40:49.013 に答える