我想根据员工的打卡时间将他们的时间数据分成多行。对于这个例子,如果他们在早上7点之前打卡,那么在此之前的所有数据将被分成一个新的数据行,而上午7点及之后的所有数据都是另一行数据。以下是具有所需结果集的一些数据的示例。这是为了帮助计算加班时间。如果他们在设定班次之前出现,那么这个时间就是加班费
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','7:00')
(100,'9/5/2017','07:00','15:00')
下面的Union All建议为我指明了正确的方向,我提出了这个查询集,为早上7:00之前打卡上班的员工创建一个新的时间记录,然后更新原始时间记录。
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发布于 2017-09-05 22:03:19
使用联合查询:
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。
发布于 2017-09-05 22:03:25
通过交叉应用的一种快速方法
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记录的

发布于 2017-09-05 22:04:03
使用UNION ALL并编写一个获取前7部分的顶部查询和一个获取后7部分的底部查询。
然后简单地按EmployeeID, TimeIn排序。
https://stackoverflow.com/questions/46056864
复制相似问题