2010-10-07 62 views
0

比方說,我有以下表如何幾個時間跨度組合

| start    | end     | activity 
+---------------------+---------------------+--------- 
| 2010-07-26 09:10:00 | 2010-07-26 09:21:00 | 6 
| 2010-07-26 09:35:00 | 2010-07-26 09:47:00 | 5 
| 2010-07-26 10:05:00 | 2010-07-26 10:45:00 | 5 
| 2010-07-26 10:50:00 | 2010-07-26 11:22:00 | 6 
| 2010-07-26 13:15:00 | 2010-07-26 13:43:00 | 7 
| 2010-07-26 14:12:00 | 2010-07-26 14:55:00 | 2 

我想小的時間跨度相結合,掌握時速活動的平均分。類似的東西:

| start    | minutes_activity | avg_activity 
+---------------------+---------------------+--------- 
| 2010-07-26 09:00:00 | 42     | {avg value} 
| 2010-07-26 10:00:00 | 50     | {avg value} 
| 2010-07-26 11:00:00 | 22     | {avg value} 
| 2010-07-26 13:00:00 | 28     | {avg value} 
| 2010-07-26 14:00:00 | 43     | {avg value} 

請注意,某些記錄可能在兩個小時內有活動分鐘,即10:50:00 - 11:22:00。在這種情況下,10分鐘應該添加到10點,22分鐘到11點。

一個解決方案,無論是MySql,PHP或兩者都讚賞。

謝謝提前。

+0

誤解了Q,對不起 – 2010-10-07 21:36:39

回答

2

讓我們假設你的表被命名爲records和你的時間間隔不經過兩個多小時的跨越:

SELECT DISTINCT(CONCAT(date,' ',IF(LENGTH(hour)=1, CONCAT('0',hour), hour), ':00:00')) AS start, 
     SUM(minutes) AS minutes_activity, 
     FORMAT(avg(activity),0) AS avg_activity 
FROM (
     SELECT date, hour, minutes, activity 
     FROM (
      SELECT DATE(start) AS date, 
        HOUR(ADDDATE(start, INTERVAL 1 HOUR)) AS hour, 
        IF(HOUR(start) < HOUR(end), MINUTE(end), 0) AS minutes, 
        activity AS activity 
      FROM records 
      HAVING minutes>0 
      ) t1 
     UNION (
      SELECT DATE(ADDDATE(start, INTERVAL 1 DAY)) AS date, 
        HOUR(ADDDATE(start, INTERVAL 1 HOUR)) AS hour, 
        IF(HOUR(start) > HOUR(end), MINUTE(end), 0) AS minutes, 
        activity AS activity 
      FROM records 
      HAVING minutes>0 
        AND hour=0 
      ) 
     UNION (
      SELECT DATE(start) AS date, 
        HOUR(start) AS hour, 
        IF(HOUR(start) < HOUR(end), 
         (60 - MINUTE(start)), 
         IF(
          DATE(start) < DATE(end), 
          (60 - MINUTE(start)), 
          (MINUTE(end) - MINUTE(start)) 
         ) 
        ) AS minutes, 
        activity AS activity 
      FROM records 
      ) 
     ORDER BY date ASC, hour ASC) t2 
GROUP BY CONCAT(date,' ',IF(LENGTH(hour)=1, CONCAT('0',hour), hour), ':00:00'); 

...但是,如果你有一個從例如雲的間隔2010-10-08 01:30:002010-10-08 03:13:00,一個(並非如此)簡單的SQL查詢不會這樣做。

+0

完美地工作。謝謝:) – ciscocert 2010-10-08 16:18:30

0

我就勾勒出你的解決方案(蠻力):

  1. 從數據庫中所有的數據獲取到PHP(這是)
  2. 獲取一小時一班的空數組
  3. 循環所有數據並獲取start開始小時的時間戳(即,舍入爲start);得到的end values計算該起點的參考點和您的start和小時之間
  4. 數量(如浮子)有了這些數據中提取它應該是相當容易(幾if S和while)爲您的活動分開來小時,將它們添加從數組2.
  5. 在這一點上,你將所有的數據分配一個小時的時間間隔。繼續進行所需的處理。

因爲您有標準時間格式,所以在計算時間戳時我建議使用strtotime。爲了增加一小時的時間,你可以使用strtotime('+1 hour', $timestamp)