okay, i used your sample data, and my first query worked fine --
Code:
CREATE TABLE emp_attendance
( trans_id BIGINT PRIMARY KEY NOT NULL
, emp_card_id VARCHAR(20) NOT NULL
, att_date DATE NOT NULL
, in_time TIMESTAMP NOT NULL
, out_time TIMESTAMP NULL
, status SMALLINT NOT NULL
);
INSERT INTO emp_attendance
( trans_id,emp_card_id,in_time,out_time,status)
VALUES
(1,'1C00EDF12D','2009-11-03 10:30:21','2009-11-03 12:30:31',0)
,(2,'1C00EDF12D','2009-11-03 13:40:00','2009-11-03 13:50:00',0)
,(3,'1C00EDF12D','2009-11-03 14:10:00','2009-11-03 14:25:00',0)
,(4,'1C00EDF12D','2009-11-03 14:30:21','2009-11-03 14:40:31',0)
,(5,'1C00EDF12D','2009-11-03 16:30:21','2009-11-03 17:30:31',0)
;
SELECT emp_card_id
, SEC_TO_TIME(SUM(TIME_TO_SEC(out_time)
-TIME_TO_SEC(in_time))) AS working_hours
FROM emp_attendance
GROUP
BY emp_card_id;
/* results --------
emp_card_id working_hours
1C00EDF12D 03:35:30
*/
i modified my second query slightly and it works fine too --
Code:
SELECT emp_card_id
, CONCAT(CAST(
CASE WHEN SUM(UNIX_TIMESTAMP(out_time)
-UNIX_TIMESTAMP(in_time)) > 86400
THEN FLOOR(
SUM(UNIX_TIMESTAMP(out_time)
-UNIX_TIMESTAMP(in_time)) / 86400 )
ELSE 0 END AS CHAR)
, ' days' ) AS working_days
, SEC_TO_TIME(MOD(
SUM(UNIX_TIMESTAMP(out_time)
-UNIX_TIMESTAMP(in_time)) , 86400 )
) AS working_hours
FROM emp_attendance
GROUP
BY emp_card_id;
/* results --------
emp_card_id working_days working_hours
1C00EDF12D 0 days 03:35:30
*/
Bookmarks