MySQL日期差异查询

时间:2016-04-27 13:52:46

标签: mysql timestamp timestampdiff

我正在尝试编写一个广泛的查询来完成以下任务;

  • 从“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

我在想我可能要写一个存储过程或类似的东西来完成这个但是我不完全确定。有人能指出我在哪里可以从这里出发吗?我不是在寻找有人为我写这整个查询,只是在正确的方向上轻推。谢谢!

2 个答案:

答案 0 :(得分:0)

正如你所问的那样,正好朝着正确的方向轻推:

怎么样

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

并从中开始工作。

请注意,在这种情况下,列顺序很重要。如果你在检索之前首先分配,它(显然也许)可以工作。

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

答案 1 :(得分: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)上创建一个复合索引,以便快速工作。

相关问题