mysql - 如何在持续时间 mysql 中从 1 获取两行?

标签 mysql date datetime sum duration

我有这样的行:

id, start_date, end_date
0, 2000-01-01 20:00:00, 2000-01-01 21:00:00
1, 2000-01-01 23:00:00, 2000-01-02 04:00:00

And I need get reporting result like:

date       | time_online
2000-01-01 | 02:00:00
2000-01-02 | 04:00:00

My solution was wrong cos i only start_date count.

SELECT DATE_FORMAT(start_date, '%Y-%m-%d') as date, 
SUM(CASE WHEN EXTRACT(DAY FROM start_date) <> EXTRACT(DAY FROM end_date) 
THEN  
    TIMESTAMPDIFF(SECOND, start_date, DATE_FORMAT(start_date + INTERVAL 1 DAY, '%Y-%m-%d')) 
ELSE 
    TIMESTAMPDIFF(SECOND, start_date, end_date) END) time_online
FROM online
GROUP BY date

结果:

date       | time_online
2000-01-01 | 02:00:00

有人可以帮助我吗?

最佳答案

您需要的是一个(虚拟)引用表,在线表中每个日期的时间跨度为 24 小时。 您可以使用表格本身来做到这一点:

SELECT
    DATE(start_date) + INTERVAL 0 HOUR ref_start,
    DATE(start_date) + INTERVAL 24 HOUR ref_end
FROM
    online
WHERE
    end_date IS NOT NULL
UNION DISTINCT
SELECT
    DATE(end_date) + INTERVAL 0 HOUR ref_start,
    DATE(end_date) + INTERVAL 24 HOUR ref_end
FROM
    online
WHERE
    end_date IS NOT NULL

+ INTERVAL 0 HOUR 并不是真正必要的,为了清楚起见,我添加了它,DISTINCT 关键字也是如此。

如果你把它放在一个子查询中,那么你可以通过(某种)自连接重叠的记录,并根据值计算差异:

SELECT 
    DATE(r.ref_start) ref_date,
    SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,
        CASE WHEN d.start_date >= r.ref_start
            THEN d.start_date
            ELSE r.ref_start
        END,
        CASE WHEN d.end_date <= r.ref_end
            THEN d.end_date
            ELSE r.ref_end
        END))) time_online
FROM
    (
    SELECT
        DATE(start_date) + INTERVAL 0 HOUR ref_start,
        DATE(start_date) + INTERVAL 24 HOUR ref_end
    FROM
        online
    WHERE
        end_date IS NOT NULL
    UNION DISTINCT
    SELECT
        DATE(end_date) + INTERVAL 0 HOUR ref_start,
        DATE(end_date) + INTERVAL 24 HOUR ref_end
    FROM
        online
    WHERE
        end_date IS NOT NULL
    ) r
JOIN
    online d
    ON d.end_date > r.ref_start
    AND d.start_date < r.ref_end
GROUP BY ref_date

关于mysql - 如何在持续时间 mysql 中从 1 获取两行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28009258/

相关文章:

mysql - 在mysql中的表(嵌套表)中创建一个表

PHP注册表问题,数据库收不到数据

c# - 检查日期时间是否与其他日期时间在同一周

Python - 给定一个时区感知日期时间对象,我如何获得时区天真的 UTC 日期时间对象?

PHP Curly Quote 字符编码问题

mysql - 如何只计算值的第一次出现?

date - Dart :在字符串中找到第一个数字并剪切字符串

javascript - 如何使用在隐藏字段内指定的日期设置日期选择器的最大日期和最小日期

Django DateField 不允许为 null

python - 什么决定了 Pandas 的最小和最大时间戳?