php - 按连续小时获取sql

标签 php mysql sql

我有一个问题。假设我在 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/

相关文章:

PHP - 在字符串中选择 5 个随机字符?

mysql - ADO 中的参数化查询 - 将数据添加到数据库中

php - preg_match_all 仅返回一个匹配项

javascript - 想根据登录 ID 申请 If 条件

php - 使用 MYSQL 格式化字符串 -- PHP

python - django 对象保存在开发中的 sqlite 和生产中的 mysql 中有所不同

php - MySQL查询多个关键字使用Php在长字符串中搜索

sql - access sql中的自动增量不起作用

python - SQLAlchemy:在 WHERE 子句中设置表达式的顺序

java - 带有查询JAVA的多个Jlabel