我想根据他们的时间将员工的时间数据拆分成多行。对于这个例子,如果他们在早上7点之前进入,那么之前的任何内容将被分成新的数据行,所有内容都是上午7点。之后是另一排。以下是具有所需结果集的某些数据的示例。这是为了帮助计算加班。如果他们在他们设定的班次之前出现,那么那个时间就是OT支付
Create Table TimeData(
[ID] [int] IDENTITY(1,1) NOT NULL,
[EmployeeID] int NULL,
[Date] date NULL,
[TimeIn] time NULL,
[TimeOut] time Null,
)
Insert Into TimeData (EmployeeID,Date,Timein,TimeOut)
Values (100,'9/5/2017','06:00','15:00')
结果集
(100, '9 /二千〇一十七分之五', '6点', '7点00')
(100, '9 /二千〇一十七分之五', '07:00', '15:00')
联盟以下所有建议都指向了正确的方向,我想出了这个查询集,为在上午7点之前打入的员工创建一个新的时间记录,然后更新原始。
BEGIN
INSERT INTO Timedata( EmployeeID,Date,TimeIn,TimeOut)
SELECT
[EmployeeID],
[Date],
[TimeIn] AS [Time], '7:00'
FROM
TimeData
WHERE
[TimeIn] < '07:00:00'
END
BEGIN
UPDATE TimeData Set TimeIn = '07:00' WHERE TimeIN < '07:00' AND TimeOut <> '7:00'
END
答案 0 :(得分:2)
使用UNION查询:
SELECT EmployeeID, Date, TimeIn, '07:00' as TimeOut FROM timedata WHERE Timein < '07:00'
UNION ALL
SELECT EmployeeID, Date, '07:00', TimeOut FROM timedata WHERE TimeOut > '07:00';
首先选择timein小于7am的所有行,并设置适当的TimeOut。然后选择TimeOut超过7am的所有记录并设置适当的TimeIn。
答案 1 :(得分:1)
通过交叉申请的一种快速方法
Select A.ID
,A.EmployeeID
,A.Date
,B.*
From TimeData A
Cross Apply (values (TimeIn,case when TimeIn<'07:00' then cast('07:00' as time) else TimeOut end)
,(case when TimeIn<'07:00' then cast('07:00' as time) else null end
,case when TimeIn<'07:00' then TimeOut else null end)
) B(TimeIn,TimeOut)
Where B.TimeIn <> B.TimeOut
退货 - 添加了7-3记录
答案 2 :(得分:1)
USE UNION ALL
并写一个获得前7部分的顶级查询,以及获得后7部分的底部查询。
然后简单地按ORDER BY EmployeeID, TimeIn
。
答案 3 :(得分:1)
我不确定我理解你的问题,是否与您所寻找的类似?
segfault
答案 4 :(得分:1)
我们可以使用表驱动方法来决定员工时间分配。
SELECT
EmployeeID,
Date,
TimeIn = CASE WHEN TD.TimeIn > splitBegin THEN TimeIn ELSE splitBegin END,
TimeOut = CASE WHEN TD.TimeOut < splitEnd THEN TimeOut ELSE splitEnd END
from TimeData TD
INNER JOIN (VALUES('00:00','07:00'),('07:00','23:59')) T(splitBegin,splitEnd)
ON (TD.TimeIN > T.splitBegin AND TD.TimeIN < T.splitEnd)
OR (TD.TimeOut > T.splitBegin AND TD.TimeOut < T.splitEnd)