我正在尝试构建一个分析时间跟踪系统中数据的查询。每次用户打入或打出时,它都会记录打卡时间。因此,如果您在9:00打卡并在5:00打卡,则会有两行记录相应的日期戳。我需要一个迭代遍历行的查询,基本上总结workingpunch_ts
(时间戳列)之间的约会时间。
每一行都有一个标识符,表示拳击是否打卡,或者打出(inout_id
,1表示输入,2表示输出)。
例如,如果你有
ID | workingpunch_ts | inout_id
----------------------------------------------
123 | 2011-02-16 09:00:00.000 | 1
124 | 2011-02-16 17:00:00.000 | 2
这将产生8小时。现在我只需要为表中的每对行重复该过程。
关于如何实现这一目标的想法?
答案 0 :(得分:1)
如果人们在同一天多次打卡和打卡,此查询会给您带来问题:
表架构:
CREATE TABLE [dbo].[TimePunch](
[TimeCardID] [int] IDENTITY(1,1) NOT NULL,
[PunchTime] [datetime] NOT NULL,
[InOrOut] [int] NOT NULL,
[UserID] [int] NOT NULL,
[DayofPunch] [datetime] NOT NULL,
CONSTRAINT [PK_TimePunch] PRIMARY KEY CLUSTERED
(
[TimeCardID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 10) ON [PRIMARY]
) ON [PRIMARY]
查询:
select
tIn.UserID,
tIn.DayOfPunch,
DateDiff(Hour, tIn.PunchTime, tOut.PunchTime) as HoursWorked
FROM
TimePunch tIn,
TimePunch tOut
WHERE
tIn.InOrOut = 1
AND tOut.InOrOut = 2
AND tIn.UserID = tOut.UserID
AND tIn.DayofPunch = tOut.DayOfPunch
答案 1 :(得分:0)
小时,确定
select empid, cast(datediff(d,0,workingpunch_ts) as datetime),
SUM(case when inout_id = 2 then 1 else -1 end *
datediff(MI, datediff(d,0,workingpunch_ts), workingpunch_ts))/60.0 as Hours
from clock
where workingpunch_ts between '20110201' and '20110228 23:59:59.999'
group by empid, datediff(d,0,workingpunch_ts)
只要输入和输出配对,就可以添加所有输出并删除所有输入,例如
- IN (9)
+ OUT (12)
- IN (13:15)
+ OUT (17)
主要代码在第2行和第3行
dateiff-datediff计算出每个workingpunch_ts
午夜的分钟数,如果是一个井喷,则使用CASE inout_id
语句将其设为负数。
其他内容会添加到现实生活场景中,您需要按日期范围内的员工和日期进行分组。