我需要总结由多个时间范围产生的时间。例如 - 我们有一些办公室的进入/退出范围:
查询必须:
这种情况下的预期结果是 8:00(8:00 到 12:00 + 14:00 到 18:00)
示例表结构:
DAY | TIME_ENTER | TIME_EXIT
2016-01-01 | 08:00 | 10:00
2016-01-01 | 08:00 | 12:00
2016-01-01 | 14:00 | 18:00
Run Code Online (Sandbox Code Playgroud)
预期结果:
DAY | TOTAL
2016-01-01 | 08:00
Run Code Online (Sandbox Code Playgroud)
表结构:
CREATE TABLE Registry
(`Date` DATE,
`Enter` TIME,
`Exit` TIME);
Run Code Online (Sandbox Code Playgroud)
示例插入
INSERT INTO Registry
VALUES
('2016-01-01', '08:00', '09:00'),
('2016-01-01', '08:00', '12:00'),
('2016-01-01', '14:00', '18:00')
Run Code Online (Sandbox Code Playgroud)
原来的
您想要汇总所有时间范围,除了那些适合同一天其他时间范围的时间范围:
SELECT DATE_FORMAT(DAY, '%Y-%m-%d')
,TIME_FORMAT(SEC_TO_TIME(TIME_TO_SEC(
SUM(TIMEDIFF(TIME_EXIT,TIME_ENTER))
)), '%H:%i') AS Total
FROM Table1 AS t
WHERE NOT EXISTS (
SELECT *
FROM Table1
WHERE DAY = t.DAY
AND TIME_ENTER <= t.TIME_ENTER AND TIME_EXIT >= t.TIME_EXIT
# not the same row; if you have an ID column, use it instead
# eg AND NOT ID = t.ID
AND NOT (TIME_ENTER = t.TIME_ENTER AND TIME_EXIT = t.TIME_EXIT)
)
GROUP BY DAY;
Run Code Online (Sandbox Code Playgroud)
编辑:正如ypercube所指出的,上述解决方案并不总是有效。以下解决方案应该涵盖所有场景。
修改后的解决方案
SELECT DATE_FORMAT(DAY, '%Y-%m-%d')
,TIME_FORMAT(SEC_TO_TIME(TIME_TO_SEC(
SUM(TIMEDIFF(TIME_EXIT,TIME_ENTER))
)), '%H:%i') AS Total
FROM (
SELECT DISTINCT t.DAY
,(SELECT MIN(TIME_ENTER) FROM Table1
WHERE TIME_EXIT BETWEEN t.TIME_ENTER AND t.TIME_EXIT) AS TIME_ENTER
,(SELECT MAX(TIME_EXIT) FROM Table1
WHERE TIME_ENTER BETWEEN t.TIME_ENTER AND t.TIME_EXIT) AS TIME_EXIT
FROM Table1 t
) AS o
GROUP BY DAY;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2839 次 |
| 最近记录: |