SQL Server在不同行之间查找datediff

时间:2011-02-23 21:12:38

标签: sql sql-server sum datediff

我正在尝试构建一个分析时间跟踪系统中数据的查询。每次用户打入或打出时,它都会记录打卡时间。因此,如果您在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小时。现在我只需要为表中的每对行重复该过程。

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

2 个答案:

答案 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语句将其设为负数。

其他内容会添加到现实生活场景中,您需要按日期范围内的员工和日期进行分组。