Sample Header Ad - 728x90

MySQL - Merge or split datetime intervals (start date to end date)

6 votes
3 answers
13800 views
I have a table which stores a list of activities with an interval of time delimited by 2 dates. Sample: +------+---------------------+---------------------+-------------+ | name | start | end | time (calc) | +------+---------------------+---------------------+-------------+ | me | 2017-04-03 11:00:00 | 2017-04-03 11:30:00 | 30 | | me | 2017-04-03 23:45:00 | 2017-04-04 00:15:00 | 30 | | me | 2017-04-04 10:00:00 | 2017-04-04 11:00:00 | 60 | | me | 2017-04-04 10:30:00 | 2017-04-04 11:30:00 | 60 | | me | 2017-04-05 23:00:00 | 2017-04-05 23:30:00 | 30 | | me | 2017-04-05 23:15:00 | 2017-04-07 00:45:00 | 1530 | +------+---------------------+---------------------+-------------+ I would like to know how many minutes are occupied each day per user (and then per week), so I need to transform current table into where intervals which share a partial space time are merged in a single one, and intervals which are in several days are split, like the next one: +------+---------------------+---------------------+-------------+ | name | start | end | time (calc) | +------+---------------------+---------------------+-------------+ | me | 2017-04-03 11:00:00 | 2017-04-03 11:30:00 | 30 | | me | 2017-04-03 23:45:00 | 2017-04-03 23:59:59 | 15 | | me | 2017-04-04 00:00:00 | 2017-04-04 00:15:00 | 15 | | me | 2017-04-04 10:00:00 | 2017-04-04 11:30:00 | 90 | | me | 2017-04-05 23:00:00 | 2017-04-05 23:59:59 | 60 | | me | 2017-04-06 00:00:00 | 2017-04-06 23:59:59 | 1440 | | me | 2017-04-07 00:00:00 | 2017-04-07 00:45:00 | 45 | +------+---------------------+---------------------+-------------+ To then query it easily in order to obtain minutes per day: +------+------------+------+ | name | day | time | +------+------------+------+ | me | 2017-04-03 | 45 | | me | 2017-04-04 | 105 | | me | 2017-04-05 | 60 | | me | 2017-04-06 | 1440 | | me | 2017-04-07 | 45 | +------+------------+------+ I were looking for information an I found how to merge multiple date intervals here (https://dba.stackexchange.com/questions/80789) , however I am not able to split an interval in several days. It is possible to do it in a single query? How could I do it? **Edit:** SQL (structure and data): CREATE TABLE activities ( id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(45), start DATETIME, end DATETIME, time INT GENERATED ALWAYS AS (TIMESTAMPDIFF(MINUTE, start, end)) VIRTUAL ); INSERT INTO activities (name, start, end) VALUES ('me','2017-04-03 11:00','2017-04-03 11:30'), ('me','2017-04-03 23:45','2017-04-04 00:15'), ('me','2017-04-04 10:00','2017-04-04 11:00'), ('me','2017-04-04 10:30','2017-04-04 11:30'), ('me','2017-04-05 23:00','2017-04-05 23:30'), ('me','2017-04-05 23:15','2017-04-07 00:45'); SQL to merge multiple intervals (Soruce: https://dba.stackexchange.com/questions/80789) : SELECT name, min(start) AS start, end, TIMESTAMPDIFF(MINUTE, MIN(start), end) AS time FROM ( SELECT x.name, x.start, min(y.end) AS end FROM activities AS x JOIN activities AS y ON x.name = y.name AND x.start = z.start AND y.end u.start AND x.start <= u.start ) GROUP BY x.name, x.start ) AS v GROUP BY name, end;
Asked by vgc (63 rep)
Apr 5, 2017, 11:40 AM
Last activity: Nov 24, 2021, 04:51 AM