2014-03-13 44 views
0

所以我的查询是这样的:PHP是否具有聚合数组中时间值的功能?

SELECT TIMEDIFF('24:00:00',(TIMEDIFF('22:00:00',TIME(end)))) AS time 
FROM sworkingtime 
WHERE user='magdalena' AND type='work' AND start BETWEEN '2014-03-01' AND '2014-03-28' AND (HOUR(`end`) > 22 OR HOUR(`end`) < 4) 
AND completed=1 

我的查询返回这样的:

02:02:36 
03:17:24 
03:07:03 
02:24:17 
03:14:09 

有没有修改这个查询返回本场的唯一SUM的一种方式,所以只有一个字段?

谢谢

+0

是否有你不想在MySQL级别执行此操作的原因? – Prix

+0

我会在MySQL中完全执行它,并且根本不用理会PHP进程 – user3036342

+0

没有理由,它只是更高级的查询 - 我编辑了这个问题。 –

回答

2

没有,有在这种情况下,没有特别的总和功能 - 尤其关注,你需要一些时间总和,不只是简单的操作。

为此,您可以在您的阵列上应用回调。非常强大的功能是array_reduce()。凡是注日期的时间间隔,则可以使用DateTime API,如:

$data = [ 
    ['time'=>'02:02:36'], 
    ['time'=>'03:17:24'], 
    ['time'=>'03:07:03'] 
]; 


$time = array_reduce($data, function($c, $x) 
{ 
    $x = explode(':', $x['time']); 
    $c = explode(':', $c); 
    return (new DateTime('2000-01-01')) 
     ->add(new DateInterval('PT'.(int)$c[0].'H'.(int)$c[1].'M'.(int)$c[2].'S')) 
     ->add(new DateInterval('PT'.(int)$x[0].'H'.(int)$x[1].'M'.(int)$x[2].'S')) 
     ->format('H:i:s'); 
}, '00:00:00'); 

- 这将导致"08:27:03"为字符串。但如果你想获得对象,请删除format()电话。

+0

这个很棒!好的一段代码,谢谢! –

+0

不错的@Alma做“+1” –

0

可以遍历数组,利用此功能来总结Sum time php

+0

我尝试过使用这个功能,但它实际上不能正常工作,时间总是不对的!不知道数据会发生什么,但我认为时间转换有一些问题。无论如何,我在MySQL查询中这样做了一步,谢谢,我更新了问题。 –

相关问题