Я пытаюсь запроса MySQL для в среднем SUM времени (из даты и времени полей) для нескольких записей для того, чтобы получить результат, как: 22:38PHP SQL: выберите AVG времени SUM из нескольких записей в формате datetime?
Мой DateTime поле checkin_time содержит данные, такие как :
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
Мой план был извлечь и выбрать время сумму от всех даты и времени полей, затем преобразование суммы в Отметка времени Unix, разделить сумму на общее количество записей и, наконец, преобразовать его обратно в момент его формат , Это (см. Код ниже) мне ничего не дает, no error no nothing. Я также понял, что пустые поля типа: 0000-00-00 00:00:00 были не учтены для получения соответствующих данных.
Может кто-нибудь, пожалуйста, помогите мне , указав ошибки или, возможно, объясните теорию о том, как вы это сделаете? Это то, что я получил до сих пор:
Edit: Благодаря Damiqib предложившего запрос рабочего SQL, до сих пор не совсем правильно, хотя. Выведенный ниже код 01:00 когда оно должно быть 23:15 что-то.
$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
}
Заранее спасибо
Edit: Решение (благодаря 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;
ли неверная '01: 00' и правильный' 23: 15', связанные с данным выборки в вашей почте или в некоторых других данных? –