MySQL 日期差异查询
MySQL Date Difference Query
我正在尝试编写将完成以下任务的扩展查询;
- Select 来自 "time_stamps" 数据库的字段 "time_stamp" 和 "status" 并按 "time_stamp" ASC 排序。
- 在字段 returned 中,对于每对时间戳(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
理想情况下,我希望查询 return 看起来像这样的数据;
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
我在想我可能必须编写一个存储过程或类似的东西来完成这个,但我不完全确定。有人可以指出我从这里去哪里的正确方向吗?我不是在找人为我写这整个查询,只是朝着正确的方向轻推。谢谢!
如您所问,只是朝着正确的方向轻推:
怎么样
SELECT @previous, @previous := `time_stamp`, `status`
FROM time_stamps
ORDER BY `time_stamp`;
并以此为基础工作。
请注意,在这种情况下,列顺序很重要。如果您在检索之前先分配它(显然可能)将无法工作。
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)
上创建复合索引以使其快速运行。
我正在尝试编写将完成以下任务的扩展查询;
- Select 来自 "time_stamps" 数据库的字段 "time_stamp" 和 "status" 并按 "time_stamp" ASC 排序。
- 在字段 returned 中,对于每对时间戳(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
理想情况下,我希望查询 return 看起来像这样的数据;
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
我在想我可能必须编写一个存储过程或类似的东西来完成这个,但我不完全确定。有人可以指出我从这里去哪里的正确方向吗?我不是在找人为我写这整个查询,只是朝着正确的方向轻推。谢谢!
如您所问,只是朝着正确的方向轻推:
怎么样
SELECT @previous, @previous := `time_stamp`, `status`
FROM time_stamps
ORDER BY `time_stamp`;
并以此为基础工作。
请注意,在这种情况下,列顺序很重要。如果您在检索之前先分配它(显然可能)将无法工作。
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)
上创建复合索引以使其快速运行。