首先,这里是我最终想要实现的目标:Fiddle
为此,我需要从三个不同的表中获取值:ok_part,reject和stoppage。
至于停工,表格结构如下:
我的图表的x轴是一小时的间隙,第一个x轴始终是8小时前的时间,最后一个时间是从现在到下一个整个小时。
我已经设法将ok_part和拒绝数组放在一起用于高图。
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。根据x轴和停工日期,我需要计算持续时间。有时我可能会使用持续时间字段,但我认为更容易避免它并且只是动态计算它。
以下是我希望通过停止实现目标的示例:
让我们说x Axis是05:00 - 06:00然后停工时间应该是59分钟,因为在停工表中有一个条目有start_date 2013-09-05 05:01:00和end_date 2013-09-05 09:00:00,但是我不能使用停工表值的结束日期,因为我需要使用x轴值06:00。
我希望你能了解我想要实现的目标,但很难解释它。
停工表中的数据也可能有所不同。在一个小时内可能会有多次停工。假设x Axis是08:00 - 09:00,表中有三个停机:
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和拒绝一样。
答案 0 :(得分: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 > ...)
和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_date
以及SUM
。
请注意与相关“停工”匹配的条件。 (start_date
&lt; j 和end_date
&gt; 我)
<强> The demo sqlFiddle 强>
尝试更改数据中的日期以观察结果。