Bra*_*ore 6 sql sql-server-2008
我正在尝试运行一些报告,并且必须处理整个员工劳动时间跨越午夜的问题.虽然我可以将午夜时分的记录拆分成两条记录,好像雇员在午夜时钟退出并同时在午夜时钟回来,从而完全避开了午夜问题.
所以,如果我有:
EmployeeId InTime OutTime
--- ----------------------- -----------------------
1 2012-01-18 19:50:04.437 2012-01-19 03:30:02.433
Run Code Online (Sandbox Code Playgroud)
你认为如何分割这条记录是最优雅的方式:
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
Run Code Online (Sandbox Code Playgroud)
是的,我已经彻底考虑了这可能会对现有功能产生什么影响......这就是为什么我选择在不影响现有功能的临时表中执行此操作的原因.
这可能有所帮助:
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
Run Code Online (Sandbox Code Playgroud)