I’m trying to run some reports and having to deal with the whole issue of employee labor hours crossing midnight. It occurs to me though that I could split the records that cross midnight into two records as if the employee clocked out at midnight and simultaneously clocked back in at midnight thus avoiding the midnight problem altogether.
So if I have:
EmployeeId InTime OutTime --- ----------------------- ----------------------- 1 2012-01-18 19:50:04.437 2012-01-19 03:30:02.433
What do you suppose would be the most elegant way to split this record like so:
EmployeeId InTime OutTime --- ----------------------- ----------------------- 1 2012-01-18 19:50:04.437 2012-01-19 00:00:00.000 1 2012-01-19 00:00:00.000 2012-01-19 03:30:02.433
And yes, I have thoroughly thought through what effects this might have on existing functionality… which is why I’m opting to do this in a temporary table that will not affect existing functionality.
Advertisement
Answer
This might help:
DECLARE @tbl TABLE ( EmployeeId INT, InTime DATETIME, OutTime DATETIME ) INSERT INTO @tbl(EmployeeId,InTime,OutTime) VALUES (1,'2012-01-18 19:50:04.437','2012-01-19 03:30:02.433') INSERT INTO @tbl(EmployeeId,InTime,OutTime) VALUES (2,'2012-01-18 19:50:04.437','2012-01-18 20:30:02.433') INSERT INTO @tbl(EmployeeID,InTime,OutTime) VALUES (3,'2012-01-18 16:15:00.000','2012-01-19 00:00:00.000') INSERT INTO @tbl(EmployeeID,InTime,OutTime) VALUES (4,'2012-01-18 00:00:00.000','2012-01-18 08:15:00.000') SELECT tbl.EmployeeId, tbl.InTime, DATEADD(dd, DATEDIFF(dd, 0, tbl.OutTime), 0) AS OutTime FROM @tbl AS tbl WHERE DATEDIFF(dd,tbl.InTime,tbl.OutTime)=1 UNION ALL SELECT tbl.EmployeeId, CASE WHEN DATEDIFF(dd,tbl.InTime,tbl.OutTime)=1 THEN DATEADD(dd, DATEDIFF(dd, 0, tbl.OutTime), 0) ELSE tbl.InTime END AS InTime, tbl.OutTime FROM @tbl AS tbl ORDER BY EmployeeId