gpt4 book ai didi

带有日期/时间和高图持续时间的 PHP 数组

转载 作者:搜寻专家 更新时间:2023-10-31 21:36:19 25 4
gpt4 key购买 nike

首先,这是我最终要实现的目标的 Fiddle:Fiddle

为此,我需要从三个不同的表中获取值:ok_part、reject 和 stoppage。

至于停止,表结构是这样的:

Stoppage table structure

我图表的 x 轴是一个小时的间隔,第一个 x 轴始终是 8 小时前的时间,最后一个是从现在到下一个完整小时的时间。

我已经设法将 ok_part 和 reject 数组放在一起用于 highchart。

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 轴是 05:00 - 06:00,那么停工持续时间应该是 59 分钟,因为停工表中有一个条目,开始日期为 2013-09-05 05:01:00,结束日期为 2013-09-05 09:00:00,但我不能使用停止表值的结束日期,因为我需要使用 x 轴值,即 06:00。

我希望您了解我要实现的目标,这真的很难解释。

停工表中的数据也可能有所不同。一小时内可能会有多次停工。假设 x 轴是 08:00 - 09:00 并且在表中有三个停顿点:

开始日期:07:54 结束日期:08:15
开始日期:08:19 结束日期:08:38
开始日期:08:45 结束日期:09:47
所以从 08:00 到 09:00 的持续时间应该是 49 分钟。

请帮我解决这个问题,我已经被这个问题困了好几天了。我试着尽可能地解释它,但我敢打赌它仍然令人困惑。

最后我想得到一个用于 highchart 的数组,就像我对 ok_part 和 reject 所做的那样。

最佳答案

想法是使用 TIMESTAMPDIFF 这将减去 end_datestart_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_datestart_dateSUM他们。

注意匹配相关“停工”的条件。 (start_date <jend_date > i)

The demo sqlFiddle

尝试更改数据中的日期以观察结果。

关于带有日期/时间和高图持续时间的 PHP 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18630290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com