我有一个问题。假设我在 SQL 中有这个表:
date user_id
2015-03-17 00:06:12 143
2015-03-17 01:06:12 143
2015-03-17 02:06:12 143
2015-03-17 09:06:12 143
2015-03-17 10:10:10 200
我想获取连续的小时数。例如,对于用户143,我想要获得2小时,对于用户200,我想要0小时。我尝试过这样的:
select user_id, TIMESTAMPDIFF(HOUR,min(date), max(date)) as hours
from myTable
group by user_id
但是此查询获取所有非连续时间。是否可以通过查询解决问题,或者我是否需要在 PHP 中对结果进行后处理?
最佳答案
使用变量与上一行进行比较。
SELECT user_id, SUM(cont_hour) FROM (
SELECT
user_id,
IF(CONCAT(DATE(@prev_date), ' ', HOUR(@prev_date), ':00:00') - INTERVAL 1 HOUR = CONCAT(DATE(t.date), ' ', HOUR(t.date), ':00:00')
AND @prev_user = t.user_id, 1, 0) AS cont_hour
, @prev_date := t.date
, @prev_user := t.user_id
FROM
table t
, (SELECT @prev_date := NULL, @prev_user := NULL) var_init_subquery
WHERE t.date BETWEEN <this> AND <that>
ORDER BY t.date
) sq
GROUP BY user_id;
我使比较比您预期的要复杂一些,但我认为有必要,您不仅要比较时间,而且还要比较同一日期(或前一天,当午夜左右时) .
- 您可以阅读有关用户变量的更多信息 here
简单说明一下:ORDER BY
以及 SELECT
子句中的顺序非常重要。 @prev_date
保存“前一行”,因为我们在进行比较后分配了当前行的值。
关于php - 按连续小时获取sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40375404/