使用SQL Server的活动时间线

使用SQL Server的活动时间线,sql,sql-server-2008,datediff,dateadd,Sql,Sql Server 2008,Datediff,Dateadd,我有一个记录用户在一天中使用刷卡系统进出特定房间的表格 我正在尝试根据存储在SQL Server中的数据创建一个更直观的报告,该数据的格式如下: EventTime |UserID |SubAddress|PeripheralName |EventTypeID|Serial number 08/05/2014 08:24|128 |1 |Upstairs (In) |20 |547929 08/05/2014 08:35|128

我有一个记录用户在一天中使用刷卡系统进出特定房间的表格

我正在尝试根据存储在SQL Server中的数据创建一个更直观的报告,该数据的格式如下:

EventTime       |UserID   |SubAddress|PeripheralName  |EventTypeID|Serial number
08/05/2014 08:24|128      |1         |Upstairs  (In)  |20         |547929
08/05/2014 08:35|128      |2         |Upstairs  (Out) |20         |547929
08/05/2014 08:37|128      |1         |Upstairs  (In)  |20         |547929
08/05/2014 09:50|128      |2         |Upstairs  (Out) |20         |547929
从这里开始,理想情况下,我需要做的是创造一种方式来显示他们何时离开办公室。我发现了一些代码,老实说,我并不完全理解这些代码,也无法对它们进行修改

DECLARE @StartDate Datetime
DECLARE @EndDate Datetime
Declare @MinDiff int
Declare @ConsStDate datetime
Declare @ConsEndDate datetime

set @StartDate = '2010-07-02 14:02' --Start time for Report
set @EndDate = '2010-07-02 16:02' --End time for Report
set @MinDiff = Datediff(Mi,@StartDate,@EndDate) --Local use

set @ConsStDate = '2010-07-02 14:22' --Consulation start time
set @ConsEndDate = '2010-07-02 15:52' --Consulation end time


--INSERT @MyTable (Value,LogTime)
SELECT Convert(varchar,DATEADD(mi,number,@StartDate),108) 
          , Case When DATEADD(mi,number,@StartDate) between @ConsStDate and @ConsEndDate Then 1 else 0 End as 'With Patient'
          FROM master..spt_values
                where [type]='p'
                     and number BETWEEN 1 AND @MinDiff
如果有人做过类似的事情,我将非常感谢任何对我今后应该做的事情的帮助

所需的输出示例

EventTime       | Status
08/05/2014 08:24    | IN
08/05/2014 08:25    | OUT
08/05/2014 08:26    | OUT
08/05/2014 08:27    | OUT
08/05/2014 08:28    | OUT
08/05/2014 08:29    | IN

好的,既然您每分钟需要一个记录输出,那么您需要一种方法来为@StartDate-@EndDate之间的某个时间间隔内的每分钟生成一个记录:

DECLARE @StartDate Datetime
DECLARE @EndDate Datetime
set @StartDate = '2010-07-02 14:02' --Start time for Report
set @EndDate = '2010-07-02 16:02' --End time for Report

select
    DateAdd(MINUTE, Number, @StartDate) AS Minutes
from    
    (   
        -- This is just a fancy way to generate a list of numbers:
        select row_number() over (order by t1.object_id) AS Number
        from sys.all_objects t1, sys.all_objects t2
    ) AS Numbers
where Number <= DateDiff(MINUTE, @StartDate, @EndDate)
使用上面的代码,您将获得所选间隔之间所有分钟的列表


现在需要做的是将上面的输出与事件表连接起来。我不会在这里提供这方面的代码,但这应该可以让您开始。

您可以发布一个预期输出的表格示例吗?抱歉,现在更新了问题。非常新。好吧,如果我理解正确的话,你想要的是每一分钟的状态,无论某人在办公室还是在办公室之外?您的输出中不也需要UserID吗?是的,差不多就是这样,我会使用UserID字段作为ID