2016-05-11 57 views
0

我想排序多維數組分成15個分鐘爲增量,用下面的數據,這是從呼叫中心數據庫中的數據進行電話記錄PHP多維數組排序到15個分鐘的間隔

CallID  CallDateTime     IsLost IsAnswered 
82650  May 10 2016 08:55:01:000AM  0  1 
82666  May 10 2016 09:03:13:000AM  0  1 
82677  May 10 2016 09:07:45:000AM  0  1 
82688  May 10 2016 09:12:19:000AM  0  1 
82689  May 10 2016 09:14:42:000AM  0  1 
82702  May 10 2016 09:22:08:000AM  0  1 
82708  May 10 2016 09:26:26:000AM  0  1 
82737  May 10 2016 09:39:42:000AM  0  1 
82739  May 10 2016 09:43:17:000AM  0  1 
82748  May 10 2016 09:45:22:000AM  0  1 
82786  May 10 2016 09:59:26:000AM  0  1 
82789  May 10 2016 10:00:21:000AM  0  1 
82820  May 10 2016 10:26:52:000AM  0  1 
82842  May 10 2016 10:37:14:000AM  0  1 
82846  May 10 2016 10:39:04:000AM  0  1 
82859  May 10 2016 10:48:30:000AM  0  1 
82865  May 10 2016 10:50:18:000AM  0  1 
82880  May 10 2016 10:56:47:000AM  0  1 
82911  May 10 2016 11:07:30:000AM  0  0 
82925  May 10 2016 11:15:34:000AM  0  1 
82926  May 10 2016 11:16:08:000AM  0  1 
82927  May 10 2016 11:16:17:000AM  0  1 
82943  May 10 2016 11:23:16:000AM  0  1 
82944  May 10 2016 11:25:54:000AM  0  1 
82947  May 10 2016 11:26:48:000AM  0  1 
82966  May 10 2016 11:33:27:000AM  0  1 
83048  May 10 2016 12:14:39:000PM  0  1 

,我從得到一個MSSQL Server數據庫,通過以下PHP代碼放置在數據

$sql = "SELECT CallID, CallDateTime, IsLost, IsAnswered FROM vwCustomReportingCallsMain WHERE DDI = '2399' AND datediff(day, CallDateTime, '2016-05-10') = 0 ORDER BY CallDateTime ASC"; 
foreach ($dbh->query($sql) as $row) 
    { 
     if($row['CallID'] != $last) { 
      $callDataArray[] = array("CallID" => $row['CallID'], "CallDateTime" => $row['CallDateTime'], "IsLost" => $row['IsLost'], "IsAnswered" => $row['IsAnswered']); 
     } 
     $last = $row['CallID']; 
    } 

所需的輸出將是像以下格式以某種方式(數據未正確)

Date/Time   IsAnswered IsLost 
May 10 2016 08:30 7   0 
May 10 2016 09:00 8   0 
May 10 2016 09:30 14   0 
May 10 2016 10:00 11   0 
May 10 2016 10:30 11   0 
May 10 2016 11:00 13   0 
May 10 2016 11:30 12   0 
May 10 2016 12:00 11   0 
May 10 2016 12:30 8   0 
May 10 2016 13:00 20   0 
May 10 2016 13:30 9   0 
May 10 2016 14:00 10   0 
May 10 2016 14:30 12   0 
May 10 2016 15:00 8   0 
May 10 2016 15:30 14   0 
May 10 2016 16:00 12   0 
May 10 2016 16:30 11   0 

關於如何在PHP甚至MSSQL PDO的任何想法? 任何幫助將是真棒 - 乾杯

+0

的可能的複製[組日期時間爲5,15,30和60個分鐘的時間間隔(http://stackoverflow.com/questions/9814930/group-datetime-into-5- 15-30和60分鐘間隔) – Terminus

+0

是的數據只是爲了格式的緣故,但我想多數民衆贊成在一個要求可能是30或15分鐘的間隔,只是試圖以15分鐘的間隔開始 –

回答

-1

您可以使用下面的代碼。它可能不完美,但它會給你一個關於如何進一步進行的想法。

function roundToNearest30($timestring) { 
    $minutes = date('i', $timestring); 
    return sprintf("%02d", $minutes - ($minutes % 30)); 
} 

$totalArray = array(); 
$lastTime = NULL; 
foreach($callDataArray as $callData){ 
    $timeString = strtotime($callData['CallDateTime']); 
    $currentHour = date('H', $timeString); 
    $nearest30Minutes = roundToNearest30($timeString); 
    $nearestTime = "{$currentHour}:{$nearest30Minutes}"; 

    //create array key based on nearest 30 minutes 
    if (!isset($totalArray[$nearestTime])){ 
     //add the array element as it does not exist 
     $totalArray[$nearestTime] = array("TotalLost" => $callData['IsLost'], "TotalAnswered" => $callData['IsAnswered']); 
    }else{ 
     //update they array element with previous data 
     $totalArray[$nearestTime]["TotalLost"] += $callData['IsLost']; 
     $totalArray[$nearestTime]["TotalAnswered"] += $callData['IsAnswered']; 
    } 
} 

foreach($totalArray as $nearest30 => $data){ 
    echo "{$nearest30}, Total Lost: {$data['TotalLost']}, Total Answered: {$data['TotalAnswered']}"; 
    echo "<br>"; 
} 

Output: 
08:30, Total Lost: 0, Total Answered: 1 
09:00, Total Lost: 0, Total Answered: 6 
09:30, Total Lost: 0, Total Answered: 4 
10:00, Total Lost: 0, Total Answered: 2 
10:30, Total Lost: 0, Total Answered: 5 
11:00, Total Lost: 0, Total Answered: 6 
11:30, Total Lost: 0, Total Answered: 1 
12:00, Total Lost: 0, Total Answered: 1 
+0

立即嘗試 - 歡呼聲 –

+0

真棒朱拉姆阿里,工程 - 好男人:) –

+0

好吧,只是一個簡單的問題 - 如何使用此輪到最近的一天,如果日期範圍是甜菜2日期,嘗試使用1440而不是30 - 只需輪到60分鐘而不是 –

1

這裏是SQL我會用:

SELECT dte = DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CallDateTime)/15 * 15, 0) AS CallPeriod, SUM(IsAnswered) AS IsAnswered, SUM(IsLost) AS IsLost 
FROM vwCustomReportingCallsMain 
WHERE DDI = '2399' AND datediff(day, CallDateTime, '2016-05-10') = 0 
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CallDateTime)/15 * 15, 0) 
ORDER BY dte ASC; 

請注意,我沒有訪問的MS SQL服務器來測試它,但它應該是非常接近。

+0

好生病嘗試現在,謝謝朱莉,我回來在一秒鐘的結果 –

+0

即時得到一個錯誤,當運行 - 「在調用本地函數'DATEDIFF',不正確的參數計數」,這是參考戒指的第一例,任何想法的? –

+0

我剛剛從自己的查詢中複製了第一個datediff。 –

0

這裏是一個PHP的解決方案:

您可以使用下面的代碼舍當前時間到最近15分鐘:

$time = strtotime('May 10 2016 08:55:01:000AM'); 
$rounded = round($time/(15 * 60)) * (15 * 60); 

所以對你來說會是這樣的:

$sql = "SELECT CallID, CallDateTime, IsLost, IsAnswered FROM vwCustomReportingCallsMain WHERE DDI = '2399' AND datediff(day, CallDateTime, '2016-05-10') = 0 ORDER BY CallDateTime ASC"; 

$callDataArray = array(); 
foreach ($dbh->query($sql) as $row) 
    { 
     if($row['CallID'] != $last) { 
      $time = strtotime($row['CallDateTime']); 
      $date = round($time/(15 * 60)) * (15 * 60); 
      if (!isset($callDataArray[$date])) { 
       $callDataArray[$date] = array(
        'isLost' => $row['IsLost'], 
        'isAnswered' => $row['IsAnswered'], 
       ); 
      } else { 
       $callDataArray[$date]['isLost'] = $callDataArray[$date]['isLost'] + row['IsLost']; 
       $callDataArray[$date]['isAnswered'] = $callDataArray[$date]['isAnswered'] + row['IsAnswered']; 
      } 
     } 
     $last = $row['CallID']; 
    } 

然後,您可以像這樣遍歷$callDataArray

<table><tr><th>Date</th><th>Answered</th><th>Lost</th></tr> 
<?php 
foreach($callDataArray as $date => $data) { 
    echo '<tr>'; 
    echo '<td>' . date('jS \of F Y h:i:s A', $date) . '</td>'; 
    echo '<td>' . $data['isAnswered'] . '</td>'; 
    echo '<td>' . $data['isLost'] . '</td>'; 
    echo '</tr>'; 
} 
?> 
</table> 
+0

立即嘗試 - 乾杯 –

+0

好吧,那麼如果我不知道關鍵值,我將如何顯示數組? –

+0

@James_Inger我已經用一個例子更新我的答案 –