特定の日に従業員が働いた合計時間を計算するために、一種の複雑な mysql クエリに取り組んでいます。一部の従業員には正しく機能しますが、他の従業員には機能しません。私が話していることを簡単に理解できるように、SQL Fiddle を作成しました。 http://sqlfiddle.com/#!2/6439f/1/0
データ:
CREATE TABLE punches
(
PunchID int auto_increment primary key,
EmpID varchar(6),
Name varchar(20),
PunchDateTime DateTime,
PunchEvent varchar(20),
`In-Out` int
);
INSERT INTO punches
(EmpID, Name, PunchDateTime, PunchEvent, `In-Out`)
VALUES
('0538', 'ROXANNE NIESEN', '2013-06-17 07:27:48', 'clockin', 1),
('0538', 'ROXANNE NIESEN', '2013-06-17 16:57:30', 'clockout', 0),
('1102', 'JEFFERY POTTER', '2013-06-17 07:29:44', 'clockin', 1),
('1102', 'JEFFERY POTTER', '2013-06-17 16:29:57', 'clockout', 0),
('1588', 'BRUCE COLEMAN', '2013-06-17 06:20:48', 'clockin', 1),
('1588', 'BRUCE COLEMAN', '2013-06-17 12:15:18', 'breakout', 0),
('1588', 'BRUCE COLEMAN', '2013-06-17 12:43:58', 'breakin', 1),
('1588', 'BRUCE COLEMAN', '2013-06-17 17:00:37', 'clockout', 0);
クエリ:
SELECT Name, DATE_FORMAT(p.PunchDateTime, '%m-%d-%Y') AS 'Punch Date',
TIME(SUM(p.PunchDateTime * (1 - 2 * `p`.`In-Out`))) AS 'Hours Worked Time',
SUM(p.PunchDateTime * (1 - 2 * `p`.`In-Out`)) AS 'Hours Worked',
SUM(UNIX_TIMESTAMP(p.PunchDateTime*(1-2*`p`.`In-Out`)))/3600 AS 'Hours Worked Decimal'
FROM punches p
WHERE DATE(p.PunchDateTime) = '2013-06-17'
GROUP BY DATE(p.PunchDateTime), EmpID
結果:
| NAME | PUNCH DATE | HOURS WORKED TIME | HOURS WORKED | HOURS WORKED DECIMAL |
------------------------------------------------------------------------------------------------------
| ROXANNE NIESEN | 06-17-2013 | (null) | 92982 | 380968.9583 |
| JEFFERY POTTER | 06-17-2013 | January, 01 1970 09:00:13+0000 | 90013 | 380968.4992 |
| BRUCE COLEMAN | 06-17-2013 | January, 01 1970 10:51:49+0000 | 105149 | 761933.2653 |
Roxanne の最初の結果は時間を返す必要があり、NULL を返します。Jeffery の 2 つ目は正しく機能しています。ブルースとの 3 番目の時間は戻りますが、私が計算した時間は間違っていました。ここで何が起こっているか知っている人はいますか?ありがとうマイク