2011-05-19 40 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