2012-08-16 1 views
0

Я пытаюсь запроса 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; 
+0

ли неверная '01: 00' и ​​правильный' 23: 15', связанные с данным выборки в вашей почте или в некоторых других данных? –

ответ

1

Это, казалось, работали с моим тестовых данных:

SELECT SEC_TO_TIME(AVG(TIME_TO_SEC(`time`))) AS averageTime 
FROM guests 
WHERE checkin_time != '0000-00-00 00:00:00' 

UPDATE :

-- Table structure for table `guests` 
CREATE TABLE `guests` (
    `checkin_time` datetime NOT NULL, 
    KEY `checkin_time` (`checkin_time`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

-- Dumping data for table `guests` 
INSERT INTO `guests` VALUES('2012-08-17 17:30:00'); 
INSERT INTO `guests` VALUES('2012-08-17 18:30:00'); 
INSERT INTO `guests` VALUES('2012-08-17 19:30:00'); 
INSERT INTO `guests` VALUES('2012-08-17 20:30:00'); 
INSERT INTO `guests` VALUES('2012-08-17 21:30:00'); 


Showing rows 0 - 0 (1 total, Query took 0.0003 sec) 
SELECT SEC_TO_TIME(AVG(TIME_TO_SEC( `checkin_time`))) AS averageTime 
FROM guests 
WHERE checkin_time != '0000-00-00 00:00:00' 
LIMIT 0 , 30 

Результат

averageTime 
19:30:00 

По крайней мере, с моими данными испытаний это, кажется, работает?

ДРУГОЙ UPDATE

<?php 

    /* 
    SELECT TIME(`checkin_time`) AS averageTime 
    FROM guests 
    WHERE checkin_time != '0000-00-00 00:00:00' 
    */ 

    // = array('22:00:00', '22:30:00'...) 
    $times = RESULT_FROM_QUERY_AS_AN_ARRAY_OF_TIMES; 

    $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; 

?> 
+0

Еще раз спасибо @Damiqib, он почти работает сейчас, но результат все еще неправильный, я знаю это, потому что все хранящиеся данные начинаются с 22:00 и варьируются между ними и 05:00 (за исключением 0000-00-00 00:00: 00). Я мог бы знать, почему: возможно ли, что все (дата) раз после 00:00, т.е. 00:30, вытащили среднее время проверки, считая «ранним на следующий день»? Если да, знаете ли вы об обходном пути? Попытайтесь заполнить свой образец db значениями datetime за 00:00, и вы, вероятно, также увидите это. Какие-нибудь дальнейшие идеи? – Jonathan

+0

Итак, если у вас есть время 22:00, 00:00 и 02:00 ->, вы бы хотели, чтобы в среднем было 00:00?И ваш диапазон всегда между 22:00 и 05:00? Ничто другое не нужно принимать во внимание? – Damiqib

+0

Точно. Это и игнорировать нулевые значения, такие как 0000: 00: 00 00:00:00, которые указывают, что гость не был проверен и не должен приниматься во внимание. – Jonathan

 Смежные вопросы

  • Нет связанных вопросов^_^