2011-05-19 70 views
1

我有一個表在MySQL中使用此格式:(時間=上插入時間戳)MySQL的加入時間戳值

id | tid | uid | time 
31 | 1 | 14 | 2011-05-19 05:42:37 //start timestamp) 
41 | 1 | 14 | 2011-05-19 07:18:42 //stop timestamp) 
45 | 1 | 14 | 2011-05-19 07:18:49 //start timestamp) 
46 | 1 | 14 | 2011-05-19 07:28:42 //stop timestamp) 

我需要的是做出一個選擇,增加了這樣的

的時間差(41 - 31) + (46 - 45)(我使用的ID而不是實際time值,以更好地瞭解我需要做的)

SELECT (something that does this) AS TotalTimeSpent WHERE tid = '1'

+0

你您對哪些時間戳是哪一種的信息嗎?是否有假設tid/uid組合的最早時間戳是開始並且在那之後交替? – 2011-05-19 17:05:40

+2

給定「開始」事件的ID的「停止」事件是可行的,它將事件的一半忽略爲棘手的「開始」事件。爲什麼你甚至使用這個(我的意思是這是一個非常客觀的方式)愚蠢的數據庫設計?你應該至少*存儲事件類型,如果不使用2個不同的表,或者甚至更好的單行與2個時間值,開始和停止。 – Blindy 2011-05-19 17:07:54

+0

如果COUNT(*)結果甚至不會觸發選擇,它就會像啓動/停止/啓動/停止一樣工作 – 2011-05-19 17:08:06

回答

2

如果你堅持使用這個表格佈局(並且我真的希望你改變主意,這真的很可怕),你可以用存儲過程中的遊標來完成。

僞代碼將是這樣的:

CREATE PROCEDURE gettotaltime() 
BEGIN 
    DECLARE total, curr, prev DATETIME; 
    DECLARE odd INT DEFAULT 1; 
    DECLARE done INT DEFAULT 0; 

    DECLARE c CURSOR FOR SELECT time FROM tbl; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    OPEN c; 

    read_loop: LOOP 
    FETCH c INTO curr; 

    IF odd=0 THEN 
     SET total=dateadd(total,datediff(curr,prev)); -- or something similar, I forget 
    END IF; 

    SET prev=curr; 
    SET odd=1-odd; 

    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    END LOOP; 

    CLOSE c; 

    SELECT total; 
END; 
+0

謝謝。我沒有選擇,它是一個已經寫好的APP,如果我修改表格結構,我必須改變很多東西。 – 2011-05-19 17:34:54

+0

如果你繼續寫這樣的報告,你會浪費更多的時間,而不僅僅是切換佈局。這整個事情可以寫成'SELECT SUM(datediff(end-start))FROM tbl'。 – Blindy 2011-05-19 17:38:59