将时间数据拆分为多行

时间:2017-09-05 13:58:46

标签: sql sql-server sql-server-2014

我想根据他们的时间将员工的时间数据拆分成多行。对于这个例子,如果他们在早上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

5 个答案:

答案 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记录

enter image description here

答案 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)