1

我正在尝试构建一个查询来分析我们的时间跟踪系统中的数据。每次用户打卡或打卡时,它都会连续记录打卡时间。因此,如果您在 9:00 打卡并在 5:00 打卡,则会有两行相应地记录这些日期戳。我需要一个查询,它将遍历行,基本上将workingpunch_ts(时间戳列)之间的 datediff 相加(以小时为单位)。

每行都有一个标识符,表示打孔是打孔还是打孔(inout_id1 表示输入,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小时。现在我只需要对表中的每一对行重复该过程。

关于如何实现这一点的想法?

4

2 回答 2

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
于 2011-02-23T21:25:27.560 回答
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 行
datediff-datediff 计算出每个 午夜后的分钟数workingpunch_ts,如果是打孔,则使用 CASEinout_id语句将其设为负数。

其他是为您需要在日期范围内按员工和日期分组的现实生活场景添加的。

于 2011-02-23T21:31:20.953 回答