使用SQL Server的活动的时间轴

时间:2014-05-08 11:44:31

标签: 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      |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

1 个答案:

答案 0 :(得分:0)

好的,因为你每分钟需要一个记录输出,你需要一种方法来在一定间隔(@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)

使用上面的代码,您将获得所选间隔之间所有分钟的列表。

现在您需要做的是将上面的输出与事件表一起加入。我不会在这里提供相应的代码,但这应该让你开始。