2017-09-05 134 views
2

我想根据用户什么时间将一个员工的时间数据拆分为多个行。对于这个例子,如果他们在早上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/5/2017年', '06:00', '07:00')

(100, '9/5/2017年', '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

但是为什么?这背后的商业原因是什么?这些转变吗?不是我的DV顺便说一句。 – scsimon

+0

DV是绝对没有显示研究工作。 –

+0

这是为了帮助计算加班。如果他们在他们设定的转移之前出现,那么这个时间就是OT付款。实际的存储过程要复杂得多。有一天会有多个时间条目,总小时数将被计算出来,但我只是需要一些关于如何清除这个冲突的集体脑力冲突。我不认为它值得一个DV,但如果它得到DV'd,我仍然得到来自社区的帮助,它仍然非常感谢 – BrianMichaels

回答

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不到早上7点,并设置相应的超时。然后选择TimeOut超过7am的所有记录并设置适当的TimeIn。

+0

但是如果有一个完全发生在7之前或之后的转变呢? –

+1

如果他们在午夜前开始工作,该怎么办?有很多如果是OP在这里解决。我认为UNION ALL是最大的啊哈!为OP。 – JNevill

+0

是的,这是谢谢你。我会开始玩这个想法并发布我的最终结果。 – BrianMichaels

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纪录

enter image description here

1

使用UNION ALL,写一个顶部查询7之前得到部分,以及底部查询,获取后7部分。

然后简单地订购EmployeeID, TimeIn

1

我不知道我理解你的问题,是什么类似于你正在寻找什么?

SELECT 
    TimeData.EmployeeID, 
    [Date], 
    TimeData.[TimeIn] AS [Time] 
FROM 
    TimeData 
WHERE 
    [TimeIn] < '07:00:00' 
UNION 
SELECT 
    TimeData.EmployeeID, 
    [Date], 
    TimeData.TimeOut As [Time] 
FROM 
    TimeData 
ORDER BY 
    EmployeeID, 
    [Date], 
    [Time] 
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)