2011-07-04 3 views
0

직원, 스테이션 및 세션이있는 데이터베이스가 있습니다. 세션은 어느 작업자가 어떤 스테이션에 있었는지를 설명합니다. 각 세션의 겹침 기간을 알려주는 쿼리를 작성했습니다. 이 쿼리와 MySQL에서 2 개의 외래 키 조합에 대한 중복 기간의 합

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 
     ) 

는 어떻게 내가 지금하고 싶은 것은 전체 오버랩 기간을 얻을 worker1에와 worker2에의 모든 조합에 대해 중복을 요약하는이

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

같은 결과를 얻을.

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가 표시되는 이유를 이해하지 못합니다. (판독 시간) UR 도움

답변

0

아 ~~~~~위한

덕분 내 어리 미안 용액의 I/3600에서 타임 스탬프를 사용하고, 시간으로 바뀌는 전환

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

상당히 단순 왜냐하면 이전의 TIME_TO_SEC 및 SEC_TO_TIME 접근법은 DATETIME 필드의 TIME 부분 만 사용했기 때문에 잘못된 번호가 생성 되었기 때문입니다. MySQL 5.5에서는 TO_SECONDS를 사용할 수 있지만 불행히도 내 서버는 여전히 5.1을 실행 중입니다.