2016-12-22 8 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のパンチタイムが4時間未満で、全体としてirをカウントする必要があります。私は以下のコードを試していますが、動作しません。設定し、その結果を希望TIMESTAMPDIFF合計ケースエラー

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

あなたのしていることは奇妙です。すでに集計された値(最小/最大)でタイムスタンプを破棄しているため、emp_idごとに計算されるケースは1つだけになるため、合計は無駄です。期待される結果は、「半日」は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が、イン/アウトパンチを交互に繰り返す時間を合計したいと思う。例えば。 1:00,2:00,4:30,5:30は2時間です。 – shmosel

+0

はい。それは月全体で数えられる必要があります。 – sandy12321