datetime - MySQL 中重叠日期时间范围的总和

标签 datetime mysql

我有一个事件表,每个事件在 MySQL 表中都有一个 StartTime 和 EndTime(作为 DateTime 类型)。

我正在尝试输出重叠时间的总和 以及重叠的事件数。

在 MySQL 中执行此查询的最有效/最简单的方法是什么?

CREATE TABLE IF NOT EXISTS `events` (
  `EventID` int(10) unsigned NOT NULL auto_increment,
  `StartTime` datetime NOT NULL,
  `EndTime` datetime default NULL,
  PRIMARY KEY  (`EventID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;


INSERT INTO `events` (`EventID`, `StartTime`, `EndTime`) VALUES
(10001, '2009-02-09 03:00:00', '2009-02-09 10:00:00'),
(10002, '2009-02-09 05:00:00', '2009-02-09 09:00:00'),
(10003, '2009-02-09 07:00:00', '2009-02-09 09:00:00');


# if the query was run using the data above,
# the table below would be the desired output

# Number of Overlapped Events | Total Amount of Time those events overlapped.
1, 03:00:00
2, 02:00:00
3, 02:00:00

这些结果的目的是生成所用小时数的账单。 (如果你有一个事件,你可能每小时支付 10 美元。但如果有两个事件,你只需支付 8 美元每小时,但仅限于你有两个事件的时间段。)

最佳答案

试试这个:

SELECT `COUNT`, SEC_TO_TIME(SUM(Duration))
FROM (
    SELECT
        COUNT(*) AS `Count`,
        UNIX_TIMESTAMP(Times2.Time) - UNIX_TIMESTAMP(Times1.Time) AS Duration
    FROM (
        SELECT @rownum1 := @rownum1 + 1 AS rownum, `Time`
        FROM (
            SELECT DISTINCT(StartTime) AS `Time` FROM events
            UNION
            SELECT DISTINCT(EndTime) AS `Time` FROM events
        ) AS AllTimes, (SELECT @rownum1 := 0) AS Rownum
        ORDER BY `Time` DESC
    ) As Times1
    JOIN (
        SELECT @rownum2 := @rownum2 + 1 AS rownum, `Time`
        FROM (
            SELECT DISTINCT(StartTime) AS `Time` FROM events
            UNION
            SELECT DISTINCT(EndTime) AS `Time` FROM events
        ) AS AllTimes, (SELECT @rownum2 := 0) AS Rownum
        ORDER BY `Time` DESC
    ) As Times2
    ON Times1.rownum = Times2.rownum + 1
    JOIN events ON Times1.Time >= events.StartTime AND Times2.Time <= events.EndTime
    GROUP BY Times1.rownum
) Totals
GROUP BY `Count`

结果:

1, 03:00:00
2, 02:00:00
3, 02:00:00

如果这不能满足您的要求,或者您需要一些解释,请告诉我。通过将重复的子查询 AllTimes 存储在一个临时表中可以使它更快,但希望它运行得足够快。

关于datetime - MySQL 中重叠日期时间范围的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1148303/

相关文章:

c# - 将时间转换为十进制

python - 从单个字符串中分离两个日期时间值

php - 如何将数据库连接到网站以便用户可以访问数据库并对其进行更改?

php - 等时间间隔后从数据库中获取数据

mysql - 将数据从 SQL Server/PostgreSQL 移动到 MySQL

php登录表单提交按钮不起作用

mysql - 如何在Mysql中获取客户端当前日期时间

Python:带有日期时间轴的 HoverToolol

datetime - f# 中自定义时钟的更好解决方案

php - 创建 php 文件以从某些本地服务器同步 mysql 数据