2012-05-02 3 views
1
 > Start     stop     pinnumber 
    > --------------------------------------------------------- 
    > 2012-03-14 13:22:17 2012-03-14 15:22:50  2001 
    > 2012-03-14 18:11:10 2012-03-14 19:10:10  2001 
    > 2012-03-15 07:20:10 2012-03-15 13:20:50  2001 
    >**2012-03-16 19:21:55  2012-03-17 02:55:22 2001** //on 16(19:21:55 
                    to 23:59:59) and  
                   //on 17(00 to 02:55:22) 
    > 2012-03-17 14:15:05 2012-03-17 17:44:50  2001 
    > 2012-03-18 19:11:10 2012-03-18 19:10:10  2002 
    > 2012-03-18 10:20:10 2012-03-18 13:20:50  2003 
    > 2012-03-18 11:20:10 2012-03-18 15:11:50  2001 

는 질문 :계산 총 시간 - PHP/MySQL은

어떻게 하루의 각 사용자의 총 시간을 계산할 수 있습니다 ('시작', '정지') 하루 ? 위의 강조 표시된 부분을 참조하십시오. 사용자가 오늘 '시작'하고 내일 중지하면 오늘 시간이 달라지고 내일 시간이 다른 것으로 가정합니다. 지금 난 다음 쿼리를 사용하고

: -

SELECT SEC_TO_TIME (SUM (TIME_TO_SEC (TIMEDIFF (stop, start)))) 시간 1 AS, 시계. * DATE_FORMAT (start, '%의 W %의 M의 %의 Y') 쿼리 위에서

내가 일의 기록에 따르면 얻고 있지만 때 BY pin_number = '2001'그룹은 시작 날짜와 중지 날짜가 다른 테이블 _ FROM. 그것은 하루 시간이 아닌 총 시간을 계산하지만 하루 시간이 필요합니다.

+0

당신이 일하고있는 것은 무엇입니까? 그렇지 않다면, 무엇이 잘못 됐습니까? 오류가 있습니까? 아니면 어떤 결과를 기대하고 있습니까? – liquorvicar

+0

문제는 시작일까지 그룹화되므로 월요일에 시작하고 언젠가는 수요일이면 48 시간 이상을 신용 할 수 있습니다. – nvuono

답변

1

드디어 도착한 것 같습니다. 먼저 시작일과 종료 시간이 UNION 인 하위 쿼리를 통해 얻을 수있는 일 집합을 가져와야합니다. JOIN의 크기를 줄이려면 원하는 경우 pinnumber을 필터링하면됩니다.

그런 다음 해당 날짜를 포함하는 (start,stop) 쌍 (예 : 하루 중 시작 또는 시작 및 중지 시간 사이의 시작)과 함께 해당 날짜를 조인합니다.

마지막으로, 하루에 한 번씩 시작 및 종료 시간 사이의 시간을 합한 다음 시작일과 종료 시간을 적절하게 잘라냅니다 (마법 86400은 하루의 초 수 = 24 * 60 * 60). 슬프게도이

SELECT FROM_UNIXTIME(unixday, '%d/%m/%Y'), SUM(
    LEAST( unixday+86400, UNIX_TIMESTAMP(Stop)) 
    - GREATEST(unixday  , UNIX_TIMESTAMP(Start)) 
) AS Seconds 
FROM table_name JOIN (

    SELECT UNIX_TIMESTAMP(DATE(Start)) AS unixday FROM table_name 
UNION 
    SELECT UNIX_TIMESTAMP(DATE(Stop)) AS unixday FROM table_name 

) AS days ON (
     UNIX_TIMESTAMP(Start) BETWEEN unixday AND unixday+86400 
    OR (unixday BETWEEN UNIX_TIMESTAMP(Start) AND UNIX_TIMESTAMP(Stop)) 
) 
WHERE pinnumber = 2001 
GROUP BY unixday; 

sqlfiddle에보기 ... 등 일광 절약, 윤초, 좋은 재생되지 않습니다.