I’m trying to query mysql for an average of SUM time (taken from datetime fields) for multiple records in order to get an output like: 22:38
My datetime field checkin_time contains data like:
2012-03-16 22:48:00 // the time here: 22:48 is what's interesting to me
2012-03-16 02:28:32
2012-03-16 00:28:47
0000-00-00 00:00:00
My plan was to extract and select the sum time from all datetime fields, then converting the sum to unix timestamp, divide the sum by total number of records and finally convert it back to time his format. This (see code below) however gives me nothing, no error no nothing. I also realized empty fields like: 0000-00-00 00:00:00 were not to be taken into account to produced relevant data.
Can anyone please help me pointing out the mistakes or perhaps explain the theory behind how you would do it? This is what i got so far:
Edit: Thanks to Damiqib for suggesting a working SQL query, still not entirely correct though. The code below outputs 01:00 when it should be 23:15 something.
$getCheckinTime = mysql_query("SELECT COUNT(id), SEC_TO_TIME( AVG( TIME_TO_SEC( `checkin_time` ) ) ) AS averageTime FROM guests WHERE checkin_time != '0000-00-00 00:00:00'") or die(mysql_error());
while($checkIn = mysql_fetch_array($getCheckinTime)) {
$timestamp = strtotime($checkIn['averageTime']);
$UnixTimeStamp = date("Y-m-d H:i:s", $timestamp); //converting to unix
$avgUnix = $UnixTimeStamp / $checkIn['COUNT(id)']; // calculating average
$avgTime = date('H:i', $avgUnix); // convert back to time his format
echo $avgTime; //outputs 01:00, got to be incorrect should be 23:15 something
}
Thanks in advance
Edit: Solution (thanks to Damiqib):
$avgCheckinTime = array();
$getCheckinTime = mysql_query("SELECT TIME(`checkin_time`) AS averageTime FROM guests WHERE checkin_time != '0000-00-00 00:00:00'") or die(mysql_error());
while($checkIn = mysql_fetch_array($getCheckinTime)) {
array_push($avgCheckinTime, $checkIn['averageTime']);
}
// = array('22:00:00', '22:30:00'...)
$times = $avgCheckinTime;
$fromReplace = array('22' => '00',
'23' => '01',
'00' => '02',
'01' => '03',
'02' => '04',
'03' => '05',
'04' => '06',
'05' => '07');
$timeSum = 0;
//Iterate through all given times and convert them to seconds
foreach ($times as $time) {
if (preg_match ('#^(?<hours>[\d]{2}):(?<mins>[\d]{2}):(?<secs>[\d]{2})$#',$time, $parse)) {
$timeSum += (int) $fromReplace[$parse['hours']] * 3600 + (int) $parse['mins'] * 60 + (int) $parse['secs'] . '<br />';
//echo $time . ' ' . ($fromReplace[$parse['hours']] *3600) . '<br />';
}
}
$toReplace = array('00' => '22',
'01' => '23',
'02' => '00',
'03' => '01',
'04' => '02',
'05' => '03',
'06' => '04',
'07' => '05');
$time = explode(':', gmdate("H:i:s", $timeSum / count($times)));
$averageCheckinTime = $toReplace[$time[0]] . ':' . $time[1] . ':' . $time[2];
//This is the final average time biased between 22-05
echo $averageCheckinTime;
This seemed to work with my test data:
UPDATE:
Result
At least with my test data this seems to be working?
ANOTHER UPDATE