2014-03-13 41 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查詢中這樣做了一步,謝謝,我更新了問題。 –

相關問題