开发者

Sum of overlap durations for each combination of 2 foreign keys in MySQL

开发者 https://www.devze.com 2023-03-17 08:58 出处:网络
i have a database with workers, stations and session. A session describes at which time which worker has been on which station. I managed to build a query that gives me the duration of the overlap of

i have a database with workers, stations and session. A session describes at which time which worker has been on which station. I managed to build a query that gives me the duration of the overlap of each session.

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
        )

With this query i get an result like this

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
...

What i would like now is to sum up the overlap for every combination of worker1 and worker2 to get the overall overlap duration.

I tried different ways of using SUM() and GROUP BY but i never got the wanted result.

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   1开发者_如何学编程0  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

the last result is close but i am still missing a lot of combinations. I also dont understand why the combination 8 - 5 is displayed.

thanks for ur help (and time to read)


aaargh, sorry for my stupidity, the solution was fairly simple

....
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

i switched to using timestamps and transforming it to hours by /3600 because my former used approach with TIME_TO_SEC and SEC_TO_TIME only used the TIME part of the DATETIME field and thereby produced some wrong numbers. With MySQL 5.5 i could use TO_SECONDS but unfortunately my server is still runing 5.1.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号