我有一个包含工人,车站和会话的数据库。会话描述了哪个工作人员在哪个工作站上。我设法构建了一个查询,它给出了每个会话重叠的持续时间。
SELECT
sA.station_id,
sA.worker_id AS worker1,
sB.worker_id AS worker2,
SEC_TO_TIME(
TIME_TO_SEC(LEAST(sA.end,sB.end)) - TIME_TO_SEC(GREATEST(sA.start,sB.start))
) AS overlap
FROM
`sessions` AS sA,
`sessions` AS sB
WHERE
sA.station_id = sb.station_id
AND
sA.station_id = 6
AND (
sA.start BETWEEN sB.start AND sB.end
OR
sA.end BETWEEN sB.start AND sB.end
)
通过此查询,我得到一个像这样的结果
station_id worker1 worker2 overlap
6 1 1 09:00:00
6 2 1 02:30:00
6 5 1 00:00:00
6 1 1 09:00:00
6 2 1 01:30:00
6 3 1 09:00:00
...
6 12 3 02:00:00
6 14 3 01:00:00
6 17 3 02:00:00
...
我现在想要的是总结worker1和worker2的每个组合的重叠,以获得整体重叠持续时间。
我尝试了使用SUM()和GROUP BY的不同方法,但我从未得到想要的结果。
SELECT
...
SEC_TO_TIME(
**SUM**(TIME_TO_SEC(LEAST(sA.end,sB.end)) - TIME_TO_SEC(GREATEST(sA.start,sB.start)))
) AS overlap
...
#has as result
station_id worker1 worker2 overlap
6 1 1 838:59:59
#in combination with
GROUP BY
worker1
#i get
station_id worker1 worker2 overlap
6 1 1 532:30:00
6 2 1 -33:00:00
6 3 1 270:30:00
6 5 1 598:30:00
6 6 1 542:00:00
6 7 1 508:00:00
6 8 5 53:00:00
6 9 1 54:30:00
6 10 1 310:00:00
6 11 1 -108:00:00
6 12 1 593:30:00
6 14 1 97:30:00
6 15 1 -53:30:00
6 17 1 293:30:00
最后的结果很接近,但我仍然缺少很多组合。我也不明白为什么会出现8 - 5组合。
感谢您的帮助(以及阅读时间)
答案 0 :(得分:0)
....
SUM(((UNIX_TIMESTAMP(LEAST(sA.end,sB.end))-UNIX_TIMESTAMP(GREATEST(sA.start,sB.start)))/3600))
...
GROUP BY station_id, worker1, worker2
ORDER BY worker1, worker2
我切换到使用时间戳并将其转换为/ 3600小时,因为我以前使用TIME_TO_SEC和SEC_TO_TIME的方法仅使用DATETIME字段的TIME部分,从而产生了一些错误的数字。使用MySQL 5.5,我可以使用TO_SECONDS但不幸的是我的服务器仍在运行5.1。