2016-12-22 3 views
-1
+-----------+-----------+--------+ 
| punchtime | punchdate | emp_id | 
+-----------+-----------+--------+ 
| 9:51:00 | 4/1/2016 |  2 | 
| 12:59:00 | 4/1/2016 |  2 | 
| 10:28:00 | 4/1/2016 |  5 | 
| 14:13:00 | 4/1/2016 |  5 | 
| 9:56:00 | 4/1/2016 |  10 | 
| 15:31:00 | 4/1/2016 |  10 | 
| 10:08:00 | 5/1/2016 |  2 | 
| 18:09:00 | 5/1/2016 |  2 | 
| 10:15:00 | 5/1/2016 |  5 | 
| 18:32:00 | 5/1/2016 |  5 | 
| 10:11:00 | 6/1/2016 |  2 | 
| 18:11:00 | 6/1/2016 |  2 | 
| 10:25:00 | 6/1/2016 |  5 | 
| 18:28:00 | 6/1/2016 |  5 | 
| 10:19:00 | 6/1/2016 |  10 | 
| 18:26:00 | 6/1/2016 |  10 | 
+-----------+-----------+--------+ 

어디에서 emp_id punchtime이 4 시간 미만이고 전체적으로 ir인지 계산해야합니다. 나는 아래 코드를 시도하고 있지만 작동하지 않는다. 설정하고 결과를 원하는TIMESTAMPDIFF 합계 케이스 오류

+-----------+-----------+ 
| emp_id | Half Day | 
+-----------+-----------+ 
|2   | 1   | 
|8   | 0   | 
|10   |0   | 
+-----------+-----------+ 
+0

당신이하고있는 일은 이상합니다. 이미 집계 된 값 (최소/최대)에 대해 timestampdiff'ing하므로 emp_id 당 하나의 '경우 만'계산되므로 합계는 쓸모가 없습니다. 예상 된 결과는 '반나절'이 1 또는 0이어야 함을 의미합니다. 맞습니까? – Sebas

+0

'punchdate'와'punchtime'의 데이터 타입은 무엇입니까? – Ponnarasu

+0

"2 8 ​​10"은 무의미한 결과입니다 – Strawberry

답변

0

귀하의 데이터하지 협정, 그래서에 갈거야 -

원하는 출력 그룹 기능의 사용이 잘못되었습니다 -

SELECT 
    a.emp_id, 
    sum( case when TIMESTAMPDIFF(hour, min(a.punchtime), 
    max(a.punchtime))< 4 then 1 else 0 end ) as 'Half Day' 
FROM machinedata a 
GROUP BY 
    a.emp_id 

나는 오류 # 1111를 얻고있다

대신 다음과 같은 ...

참고 두 방법을 고려 ... 무시 나는 문제를 제시하고 솔루션의 구성을 제시했다.

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(employee_id INT NOT NULL 
,punchtime DATETIME NOT NULL 
,PRIMARY KEY(employee_id,punchtime) 
); 

INSERT INTO my_table VALUES 
(2,'2016/01/04 09:51:00'), 
(2,'2016/01/04 12:59:00'), 
(5,'2016/01/04 10:28:00'), 
(5,'2016/01/04 14:13:00'), 
(10,'2016/01/04 09:56:00'), 
(10,'2016/01/04 15:31:00'), 
(2,'2016/01/05 10:08:00'), 
(2,'2016/01/05 18:09:00'), 
(5,'2016/01/05 10:15:00'), 
(5,'2016/01/05 18:32:00'), 
(2,'2016/01/06 10:11:00'), 
(2,'2016/01/06 18:11:00'), 
(5,'2016/01/06 10:25:00'), 
(5,'2016/01/06 18:28:00'), 
(10,'2016/01/06 10:19:00'), 
(10,'2016/01/06 18:26:00'); 

SELECT employee_id 
    , SUM(diff < 14400) half 
    FROM 
    (SELECT x.* 
      , DATE(x.punchtime) dt 
      , TIME_TO_SEC(MAX(y.punchtime)) - TIME_TO_SEC(MIN(x.punchtime)) diff 
      FROM my_table x 
      JOIN my_table y 
      ON y.employee_id = x.employee_id 
      AND DATE(y.punchtime) = DATE(x.punchtime) 
     GROUP 
      BY x.employee_id 
      , dt 
    ) n 
    GROUP 
    BY employee_id; 
+-------------+------+ 
| employee_id | half | 
+-------------+------+ 
|   2 | 1 | 
|   5 | 1 | 
|   10 | 0 | 
+-------------+------+ 
+0

가입 할 시점이 보이지 않습니다. 또한, 나는 OP가 in/out 펀치가 교대로 반복되는 시간을 합산하려고합니다. 예 : 1 : 00,2 : 00,4 : 30,5 : 30은 2 시간입니다. – shmosel

+0

예. 전체 달 동안 계산되어야합니다. – sandy12321