2016-04-27 187 views
0

我想写一个广泛的查询,将完成以下任务;MySQL日期差异查询

  • 从“time_stamps”数据库中选择字段“time_stamp”和“status”,并按“time_stamp”ASC对它们进行排序。
  • 在返回的字段中,对于每对时间戳(1入1出),我需要以小时为单位获得差异。

这是我到目前为止在查询中的内容。

SELECT time_stamp AS 'time', status AS 'status' FROM time_stamps WHERE user_id = '55' ORDER BY time 

然后我有这个查询从两个日期得到的差异,以小时计。

SELECT TIMESTAMPDIFF(SECOND, '2016-04-26 07:01:26', '2016-04-26 15:07:55')/3600.0 

理想情况下,我想查询返回看起来像这样的数据;

time_stamp   status difference 
2016-04-18 06:57:04  1 
2016-04-18 11:19:49  0 8.11 
2016-04-18 11:41:01  1 
2016-04-18 15:21:02  0 3.67 
2016-04-19 07:06:16  1 
2016-04-19 10:58:34  0 3.87 
2016-04-19 11:18:50  1 
2016-04-19 15:16:00  0 3.95 
2016-04-20 06:58:30  1 
2016-04-20 12:46:33  0 5.80 

我在想,我可能不得不编写一个存储过程或类似的东西来实现这一点,但我并不完全确定。有人能指引我走向何方?我不想找人为我写这整个查询,只是向正确的方向推动。谢谢!

回答

0
SELECT time_stamp, status, 
     TIMESTAMPDIFF(
       SECOND, 
       (
       SELECT ti.time_stamp 
       FROM time_stamps ti 
       WHERE ti.user_id = t.user_id 
         AND ti.time_stamp <= t.time_stamp 
         AND t.status = 0 
         AND ti.status = 1 
       ORDER BY 
         ti.user_id DESC, ti.time_stamp DESC 
       LIMIT 1 
       ), 
       time_stamp 
       ) 
FROM time_stamps t 
WHERE user_id = :myuserid 

这个创建于(user_id, time_stamp)复合指数快速地工作。

+0

随着一些修补程序,我让你的代码完美工作。感谢您的帮助Quassnoi! – Kronos1

0

在正确的方向只是微调,因为你问:

如何

SELECT @previous, @previous := `time_stamp`, `status` 
FROM time_stamps 
ORDER BY `time_stamp`; 

和工作从。

请注意,列顺序在这种情况下很重要。如果你在检索之前先分配它,它不会(很明显可能)工作。

概念证明:http://sqlfiddle.com/#!9/4e17b5/2