按日分钟记录日志数据

时间:2011-10-27 14:25:29

标签: sql sql-server

我有一个包含PeopleSoft登录信息的表格(Excel工作表,无论......),包含三列:登录时间,退出时间,花费的时间。

我的经理被要求使用它来提供整个数据集(白天)的并发登录的一分钟一分钟。

因此,表的SELECT就像这样:

SELECT LOGIN.Login, LOGIN.[Log out], LOGIN.[Time in]
FROM LOGIN;

输出如下:

Login               Log out             Time in
11/1/10 12:36 AM    11/1/10 12:42 AM    0:06
...

我需要的是:

Time                    Concurrent_Logins  
11/1/10 12:36 AM        16

...

所以,这很复杂。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您要做的是构建一个包含当天每分钟的表格。您可以通过多种方式执行此操作,只需搜索“计数表”等。

一旦你有一个包含所有会议记录的表格(以日期时间格式),它应该很简单。

在登录/注销之间的分钟加入您的登录表到分钟表,并为每分钟计数(*)。

答案 1 :(得分:1)

Derek的解决方案是要走的路。

http://www.ridgway.co.za/archive/2007/11/23/using-a-common-table-expression-cte-to-generate-a-date.aspx解释了一种生成时间表的方法

SET DATEFORMAT DMY
GO
DECLARE @STARTDATE DATETIME
DECLARE @ENDDATE DATETIME

SELECT @STARTDATE = '02/01/2011 01:00', @ENDDATE = '03/01/2011 01:00'
;

WITH DateRange(MyDateTime) AS
(
    SELECT
      @STARTDATE AS MyDateTime
    UNION ALL
    SELECT
        DATEADD(minute, 1, MyDateTime) AS MyDateTime
    FROM
        DateRange
    WHERE
        MyDateTime < @ENDDATE
)
SELECT MyDateTime, ConcurrentConnections = COUNT(*) 
       FROM DateRange INNER JOIN [LOGIN] ON MyDateTime >= [LogIn] AND MyDateTime <= [Log Out]
   OPTION (MaxRecursion 10000);

答案 2 :(得分:0)

要解决此问题,我首先会从数据集中获取最小和最大日期时间值。这将提供我们需要确定并发登录计数的时间范围。在获得时间范围之后,我会做一个循环来填充表中每分钟的范围以及该分钟的并发登录数。在填充表格之后,我将从中选择并发登录计数&gt; 0,这将是我的结果集。我使用SQL Server,您可能需要将一些语法转换为另一个DBMS。

-- To get the min and max of the time range
DECLARE @min datetime, @max datetime
SELECT @min = MIN(l.[Login]), @max = MAX(l.[Log out])
  FROM [LOGIN] l

-- now make a table to how the minutes and the counts
CREATE TABLE #Result
(
    [Time] datetime,
    [count] int
)

-- now do a loop to fill each minute between @min and @max
DECLARE @currentTime datetime, @count int
SELECT @currentTime = @min, @count = 0
-- go from @min to @max
WHILE @currentTime < @max
BEGIN
    -- get the count of concurrent logins for @currentTime
    SELECT @count = COUNT(*)
      FROM [LOGIN] l
     WHERE @currentTime between l.[Login] and l.[Log out]

    -- insert into our results table
    INSERT #Result ([Time], [count]) VALUES (@currentTime, @count)

    -- increment @currentTime for next pass
    SELECT @currentTime = DATEADD(minute, 1, @currentTime) 
END

-- select final result (where count > 0)
SELECT *
  FROM #Result
 WHERE [count] > 0

-- clean up our temp table
DROP TABLE #Result