2014-07-21 189 views
0

嗨,我只是新的MySQL。我有一個表是這樣的:計算時間戳記之間的差異myqsl

TIME    | USER  | interval 
---------------------------------------------- 
2014-07-06 23:00:42 |  ngm  | 
---------------------------------------------- 
2014-07-06 23:01:33 |  ngm  | 
---------------------------------------------- 
2014-07-06 23:02:41 |  cpg  | 
---------------------------------------------- 
2014-07-06 23:03:48 |  ngm  | 
---------------------------------------------- 
2014-07-06 23:13:09 |  cpg  | 
---------------------------------------------- 
2014-07-06 23:18:31 |  cpg  | 
---------------------------------------------- 

我需要通過「用戶」計算「時間」之間分鐘的差別幫助,所以它看起來是這樣的:

TIME    | USER  | interval 
---------------------------------------------- 
2014-07-06 23:00:42 |  ngm  | 0 
---------------------------------------------- 
2014-07-06 23:01:33 |  ngm  | 1 
---------------------------------------------- 
2014-07-06 23:02:41 |  cpg  | 0 
---------------------------------------------- 
2014-07-06 23:03:48 |  ngm  | 2 
---------------------------------------------- 
2014-07-06 23:13:09 |  cpg  | 11 
---------------------------------------------- 
2014-07-06 23:18:31 |  cpg  | 5 
---------------------------------------------- 

請幫助。

+0

http://stackoverflow.com/questions/5070111/difference-in-minutes-from-two-time-fields-in-mysql –

+0

你有主鍵?如果不是,則添加一個以使計算更容易。 –

+0

@AhhikChakraborty推測,(時間,用戶)是主鍵! – Strawberry

回答

1
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(time DATETIME NOT NULL,user CHAR(3) NOT NULL,PRIMARY KEY(time,user)); 

INSERT INTO my_table VALUES 
('2014-07-06 23:00:42','ngm'), 
('2014-07-06 23:01:33','ngm'), 
('2014-07-06 23:02:41','cpg'), 
('2014-07-06 23:03:48','ngm'), 
('2014-07-06 23:13:09','cpg'), 
('2014-07-06 23:18:31','cpg'); 

mysql> SELECT * FROM my_table; 
+---------------------+------+ 
| time    | user | 
+---------------------+------+ 
| 2014-07-06 23:00:42 | ngm | 
| 2014-07-06 23:01:33 | ngm | 
| 2014-07-06 23:02:41 | cpg | 
| 2014-07-06 23:03:48 | ngm | 
| 2014-07-06 23:13:09 | cpg | 
| 2014-07-06 23:18:31 | cpg | 
+---------------------+------+ 

SELECT x.* 
     , COALESCE(
      SEC_TO_TIME(
      ROUND(TIME_TO_SEC(
       TIMEDIFF(x.time,MAX(y.time)) 
      )/60 
      )*60 
      ),0 
     ) my_interval -- <-- can probably make shorter 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.user = x.user 
    AND y.time < x.time 
    GROUP 
    BY time 
     , user; 
+---------------------+------+-------------+ 
| time    | user | my_interval | 
+---------------------+------+-------------+ 
| 2014-07-06 23:00:42 | ngm | 0   | 
| 2014-07-06 23:01:33 | ngm | 00:01:00 | 
| 2014-07-06 23:02:41 | cpg | 0   | 
| 2014-07-06 23:03:48 | ngm | 00:02:00 | 
| 2014-07-06 23:13:09 | cpg | 00:10:00 | 
| 2014-07-06 23:18:31 | cpg | 00:05:00 | 
+---------------------+------+-------------+ 
+0

+1好答案。你能否快速解釋「SEC_TO_TIME」? – Darren

+1

這是TIME_TO_SEC的反面;-) – Strawberry

+0

謝謝先生;-) – Darren