Author |
Topic |
tanu
Yak Posting Veteran
57 Posts |
Posted - 2007-09-12 : 09:44:57
|
I have a table like this. Employee comes in and clock in. If [Clock out] is 'True' then the time on that record is for clocking out. Time Employeeid Clockout Julian RecordNumber8/22/2007 9:47:34 AM 1 False 39376 788/22/2007 9:47:47 AM 1 True 39376 798/22/2007 9:50:18 AM 1 False 39376 808/22/2007 10:41:34 AM 1 True 39376 828/22/2007 10:44:34 AM 1 False 39376 848/22/2007 11:48:34 AM 1 True 39376 868/28/2007 4:47:34 AM 1 False 39386 1408/28/2007 5:47:34 AM 1 True 39386 1418/22/2007 10:42:34 AM 2 False 39376 838/22/2007 11:40:34 AM 2 True 39376 851.I need to find out how long did employee 1 work on 8/22/2007 and 8/28/2007 ? |
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2007-09-12 : 10:14:54
|
[code]DECLARE @sample TABLE( [Time] datetime, Employeeid int, Clockout varchar(10), Julian int, RecordNumber int)INSERT INTO @sampleSELECT '8/22/2007 9:47:34 AM', 1, 'False', 39376, 78 UNION ALLSELECT '8/22/2007 9:47:47 AM', 1, 'True', 39376, 79 UNION ALLSELECT '8/22/2007 9:50:18 AM', 1, 'False', 39376, 80 UNION ALLSELECT '8/22/2007 10:41:34 AM', 1, 'True', 39376, 82 UNION ALLSELECT '8/22/2007 10:44:34 AM', 1, 'False', 39376, 84 UNION ALLSELECT '8/22/2007 11:48:34 AM', 1, 'True', 39376, 86 UNION ALLSELECT '8/28/2007 4:47:34 AM', 1, 'False', 39386, 140 UNION ALLSELECT '8/28/2007 5:47:34 AM', 1, 'True', 39386, 141 UNION ALLSELECT '8/22/2007 10:42:34 AM', 2, 'False', 39376, 83 UNION ALLSELECT '8/22/2007 11:40:34 AM', 2, 'True', 39376, 85SELECT [Date], ClockIn, ClockOut, [work] = DATEDIFF(minute, ClockIn, ClockOut)FROM( SELECT [Date] = DATEADD(DAY, DATEDIFF(DAY, 0, [Time]), 0), ClockIn = MIN(CASE WHEN Clockout = 'False' THEN [Time] END), ClockOut = MAX(CASE WHEN Clockout = 'True' THEN [Time] END) FROM @sample GROUP BY DATEADD(DAY, DATEDIFF(DAY, 0, [Time]), 0)) t[/code] KH[spoiler]Time is always against us[/spoiler] |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-09-12 : 10:32:41
|
[code]DECLARE @Sample TABLE (Time DATETIME, Employeeid INT, Clockout VARCHAR(5), Julian INT, RecordNumber INT)INSERT @SampleSELECT '8/22/2007 9:47:34 AM', 1, 'False', 39376, 78 UNION ALLSELECT '8/22/2007 9:47:47 AM', 1, 'True', 39376, 79 UNION ALLSELECT '8/22/2007 9:50:18 AM', 1, 'False', 39376, 80 UNION ALLSELECT '8/22/2007 10:41:34 AM', 1, 'True', 39376, 82 UNION ALLSELECT '8/22/2007 10:44:34 AM', 1, 'False', 39376, 84 UNION ALLSELECT '8/22/2007 11:48:34 AM', 1, 'True', 39376, 86 UNION ALLSELECT '8/28/2007 4:47:34 AM', 1, 'False', 39386, 140 UNION ALLSELECT '8/28/2007 5:47:34 AM', 1, 'True', 39386, 141SELECT c.EmployeeID, DATEADD(DAY, DATEDIFF(DAY, 0, ClockIn.Time), 0) AS ClockDate, CONVERT(CHAR(10), DATEADD(SECOND, SUM(DATEDIFF(SECOND, ClockIn.Time, ClockOut.Time)), 0), 108) AS WorkTimeFROM ( SELECT s1.EmployeeID, s1.RecordNumber AS ClockIn, MIN(s2.RecordNumber) AS ClockOut FROM @Sample AS s1 INNER JOIN @Sample AS s2 ON s2.EmployeeID = s1.EmployeeID WHERE s1.ClockOut = 'False' AND s1.RecordNumber < s2.RecordNumber AND s2.ClockOut = 'True' GROUP BY s1.EmployeeID, s1.RecordNumber ) AS cINNER JOIN @Sample AS ClockIn ON ClockIn.EmployeeID = c.EmployeeIDINNER JOIN @Sample AS ClockOut ON ClockOut.EmployeeID = c.EmployeeIDWHERE ClockIn.RecordNumber = c.ClockIn AND ClockOut.RecordNumber = c.ClockOutGROUP BY c.EmployeeID, DATEADD(DAY, DATEDIFF(DAY, 0, ClockIn.Time), 0)ORDER BY c.EmployeeID, DATEADD(DAY, DATEDIFF(DAY, 0, ClockIn.Time), 0)[/code] E 12°55'05.25"N 56°04'39.16" |
 |
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2007-09-12 : 10:42:02
|
Oops. Did not read the requirement properly  KH[spoiler]Time is always against us[/spoiler] |
 |
|
tanu
Yak Posting Veteran
57 Posts |
Posted - 2007-09-12 : 12:23:12
|
Thanks. |
 |
|
|
|
|