2012-10-02 34 views
5

Soy nuevo en php y tengo un problema con la manipulación de fecha/hora.¿Cómo se agrupan los intervalos de tiempo en php/mysql y se obtienen estadísticas basadas en esos grupos de tiempo?

Necesito hacer estadísticas sobre visitas diarias/mensuales/anuales en alguna tienda. Hay una base de datos mysql con tabla "estadísticas" y fields: "statistic_id" (integer, primary key) , "visitors" (integer), and "dateAndTime" (timestamp). Tengo un formulario donde el usuario ingresa el número de visitantes que llegaron a la tienda, y ese número se inserta en la base de datos junto con la hora y fecha usando la función now().

Así que básicamente mi base de datos se parece a:

statistic_id , visitors , timeAndDate <br /> 
1............, 3........., 2012-09-29 14:45:02 <br /> 
2............, 5........., 2012-09-29 14:46:31 <br /> 
3............, 2........., 2012-09-29 18:48:11 ...etc. 

Lo que tengo que hacer es suma y mostrar a todos los visitantes que estuvieron en el intervalo de tiempo específico. 09h-12h ; 12h-15h ; 15h-18h ; 18h-21h. Entonces necesito mostrar en la tabla todos estos intervalos y el número de visitantes para cada uno de ellos. El problema es que no sé cómo extraer estos intervalos y luego obtener la suma de visitantes para ellos. Intentaba todo lo que sé y pude encontrar, pero sin éxito. También tendré que obtener estadísticas mensuales y anuales, así que ¿cómo puedo obtener todos 12 months de esta columna timeAndDate y luego sum all visitors for each month?

¿Alguien tiene una idea de cómo hacer esto, y está dispuesto a explicarme en detalle, por favor? Gracias

Respuesta

5

Para conseguir que los visitantes entre las 09:00 y las 12:00

SELECT 
    SUM(`visitors`) 

FROM 
    `my_table` 

WHERE 
    HOUR(`timeAndDate`) BETWEEN 9 AND 12 

Para llegar visitantes por mes

SELECT 
    MONTH(`timeAndDate`), 
    SUM(`visitors`) 

FROM 
    `my_table` 

GROUP BY 
    MONTH(`timeAndDate`) 

Para recibir visitantes por año

SELECT 
    YEAR(`timeAndDate`), 
    SUM(`visitors`) 

FROM 
    `my_table` 

GROUP BY 
    YEAR(`timeAndDate`) 

PHP ejemplo sencillo para dar salida a los meses en una mesa

<?php 

    // Connect to database 
    $db = mysqli_connect('localhost', 'root', 'root', 'test') or die('Could not connect to database'); 

    // Prepare sql question 
    $sql = "SELECT 
       MONTHNAME(`timeAndDate`) AS `month`, 
       SUM(`visitors`) AS `visitors` 

      FROM 
       `test` 

      GROUP BY 
       MONTH(`timeAndDate`)"; 

    // Query the database 
    $result = mysqli_query($db, $sql); 

    // Begin table 
    print '<table><thead><tr><th>Month</th><th>Visitors</th></tr></thead><tbody>'; 

    // Loop result 
    while($row = mysqli_fetch_assoc($result)) { 
     print "<tr><td>{$row['month']}</td><td>{$row['visitors']}</td></tr>"; 
    } 

    // End table 
    print '</tbody></table>'; 

?> 
+0

Gracias por la respuesta, pero ¿cómo puedo mostrar esto? ¿Cómo puedo mostrar en la tabla la suma de visitantes para cada intervalo de tiempo? Thx – offline

+0

Agregó un ejemplo rápido a la respuesta – lix

+0

Muchas gracias, está funcionando. Solo una pregunta más, todavía no estoy seguro, ¿cómo puedo mostrar los 4 intervalos de tiempo del día y sus visitantes al mismo tiempo? Entonces debería ser 09h-12h: num. de visitantes; 12h-15h: num. de visitantes ... todo resulta en una tabla – offline

0
SELECT DATE(timeAndDate), SUM(visitors) FROM Table 
WHERE 
DATE_FORMAT(timeAndDate,'%k') BETWEEN 9 AND 12 
AND YEAR(timeAndDate) = 2012 
GROUP BY MONTH(timeAndDate) 
+0

¿Cómo puedo obtener los resultados? Estoy intentando con: while ($ row = $ result-> fetch_array (MYSQLI_ASSOC)) {... Pero me sale el mensaje de error: Llamar a una función de miembro fetch_array() en un objeto no – offline

+0

probarlo de nuevo Lo he editado un poco – Martin

+0

No hay errores, pero tampoco hay ningún resultado. Estoy tratando de obtener datos como este: while ($ row = $ result-> fetch_array (MYSQLI_ASSOC)) {\t \t $ visitors = $ row ['SUM (visitors)']; $ dateAndTime = $ row ['dateAndTime']; $ timestamp = strtotime ($ dateAndTime); \t echo " \t \t \t ".htmlentities ($ visitantes, ENT_QUOTES, 'UTF-8'). " \t \t ". date (' H: i, dm-Y ', $ timestamp). " \t"; \t } ¿Qué pasa aquí? – offline

Cuestiones relacionadas