복붙노트

[SQL] 총 시간은 하루 MySQL의에서 일하기

SQL

총 시간은 하루 MySQL의에서 일하기

나는 직원의 로그인과 로그 아웃 타이밍이 기록되는 MySQL의 테이블이 있습니다. 여기서, 인 - 아웃 칼럼 로그인 1- 나타냄 아웃을 0-나타낸다.

  [id]   [User_id]           [Date_time]                 [in_out]
    1       1          2011-01-20 09:30:03                  1
    2       1          2011-01-20 11:30:43                  0
    3       1          2011-01-20 11:45:12                  1
    4       1          2011-01-20 12:59:56                  0
    5       1          2011-01-20 13:33:11                  1
    6       1          2011-01-20 15:38:16                  0
    7       1          2011-01-20 15:46:23                  1
    8       1          2011-01-20 17:42:45                  0

그것은 단일 쿼리를 사용하여 사용자가 하루에 일한 총 시간을 검색 할 수 있습니까?

나는 헛된에서 많은입니다 제외한 모든 시도했다. 나는 배열하지만 단일 쿼리를 사용하여 그렇게 할 수 없습니다를 사용하여 PHP에서이 작업을 수행 할 수 있습니다.

해결법

  1. ==============================

    1.

    SELECT `User_id`, time(sum(`Date_time`*(1-2*`in_out`)))
      FROM `whatever_table` GROUP BY `User_id`;
    

    (1-2 *`in_out`) 용어는 모든 로그인 이벤트에게 -1 요인 및 모든 로그 아웃 이벤트 +1 요인을 제공합니다. SUM 함수는 DATE_TIME 열의 합을 취하고, GROUP BY 'User_id` 각각의 다른 사용자에 대한 합이 만들어 지도록한다.

  2. ==============================

    2.생각의 루디의 라인은 정확합니다. 당신은 진수와 시간을 원하는 경우에, 그렇지 않으면 반환 형식이 될 것이라고 DATE_TIME 필드에서 DATETIME을 UNIX_TIMESTAMP ()를 사용 (하드 구문 분석). 여기에 데이터의 첫 번째 4 개 라인의 결과 플러스 2 다른 일에 더 :

    생각의 루디의 라인은 정확합니다. 당신은 진수와 시간을 원하는 경우에, 그렇지 않으면 반환 형식이 될 것이라고 DATE_TIME 필드에서 DATETIME을 UNIX_TIMESTAMP ()를 사용 (하드 구문 분석). 여기에 데이터의 첫 번째 4 개 라인의 결과 플러스 2 다른 일에 더 :

    SELECT 
        `user_id`, 
        DATE(`date_time`) AS `date`, 
        SUM(UNIX_TIMESTAMP(`date_time`)*(1-2*`in_out`))/3600 AS `hours_worked`
    FROM `test` 
    GROUP BY date(`date_time`), `user_id`;
    +---------+------------+--------------+
    | user_id | date       | hours_worked |
    +---------+------------+--------------+
    |       1 | 2011-01-20 |       3.2567 |
    |       1 | 2011-01-21 |       3.0000 |
    +---------+------------+--------------+
    
  3. ==============================

    3.이것을를 사용 해보세요 :

    이것을를 사용 해보세요 :

    select [User_id], sum([Time_count])/3600
    from (
      select [User_id],
             case when [in_out]=1 then   UNIX_TIMESTAMP([Date_time])
                  when [in_out]=0 then - UNIX_TIMESTAMP([Date_time])
                  end as [Time_count]
      from my_table
    ) as a
    group by [User_id]
    

    누군가 발견 오류,이를 수정하십시오 그래서 MySQL의 구문을 모른다. 아마 작동하지 않을 수 있습니다. 예를 들어 사용자가 로그인 한 경우.이 경우는 하나의 상기 [in_out] 필드 0의 개수가 동일한 경우에만 사용자를 필터링 할 수있다.

  4. from https://stackoverflow.com/questions/4745182/get-total-hours-worked-in-a-day-mysql by cc-by-sa and MIT license